Chociaż Android oferuje różne widżety z małymi, interaktywnymi elementami wielokrotnego użytku, może być konieczne ponowne wykorzystanie większych komponentów, które wymagają specjalnego układu. Aby efektywnie używać kompletnych układów, użyj tagów <include>
i <merge>
, aby umieszczać jeden układ wewnątrz drugiego.
Dzięki temu możesz tworzyć złożone układy, np. panel z przyciskami „Tak” i „Nie” lub niestandardowy pasek postępu z tekstem opisowym. Oznacza to, że możesz wyodrębnić dowolne elementy aplikacji, które są wspólne dla wielu układów, zarządzać nimi osobno i umieszczać je w każdym układzie. Chociaż możesz tworzyć poszczególne komponenty UI, pisząc niestandardowy kodView
, łatwiej jest to zrobić, używając pliku układu.
Tworzenie układu do wielokrotnego użytku
Zacznij od utworzenia nowego pliku XML i zdefiniowania układu, który chcesz ponownie wykorzystać. Oto przykład układu, który definiuje pasek tytułu do uwzględnienia w każdej aktywności (titlebar.xml
):
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/titlebar_bg"
tools:showIn="@layout/activity_main" >
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gafricalogo" />
</FrameLayout>
Element główny View
musi być dokładnie taki sam, jak ma być wyświetlany w każdym układzie, w którym zamierzasz dodać ten układ.
Używanie tagu <include>
W układzie, w którym chcesz dodać komponent wielokrotnego użytku, dodaj tag <include>
. Oto na przykład układ zawierający pasek tytułu z poprzedniego przykładu:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/app_bg"
android:gravity="center_horizontal">
<include layout="@layout/titlebar"/>
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:padding="10dp" />
...
</LinearLayout>
Możesz też zastąpić wszystkie parametry układu (wszystkie atrybuty android:layout_*
) widoku wyższego poziomu uwzględnionego układu, podając je w tagu <include>
. Przykład:
<include android:id="@+id/news_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/title"/>
Jeśli jednak chcesz zastąpić atrybuty układu za pomocą tagu <include>
, zastąp też atrybuty android:layout_height
i android:layout_width
, aby inne atrybuty układu zaczęły obowiązywać.
Używanie tagu <merge>
Tag <merge>
pomaga wyeliminować zbędne grupy widoków w hierarchii widoków, gdy jeden układ jest zawarty w innym. Jednym z przypadków użycia funkcji <merge>
jest implementacja widoku niestandardowego przez rozszerzenie widoku ViewGroup
.
Jeśli na przykład układ główny to układ pionowy LinearLayout
, w którym 2 kolejne widoki można ponownie wykorzystać w kilku układach, to układ wielokrotnego użytku, w którym umieszczasz te 2 widoki, wymaga własnego widoku wyższego poziomu. Jednak użycie innego elementu LinearLayout
jako elementu głównego w przypadku układu wielokrotnego użytku spowoduje utworzenie pionowego elementu LinearLayout
wewnątrz pionowego elementu LinearLayout
. Zagnieżdżony element LinearLayout
nie pełni żadnej funkcji i spowalnia działanie interfejsu.
Zamiast tego możesz rozszerzyć LinearLayout
, aby utworzyć widok niestandardowy, i użyć pliku XML układu, aby opisać widoki podrzędne. Najwyższy tag w pliku XML to <merge>
, a nie LinearLayout
, jak w tym przykładzie:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>
</merge>
Gdy umieścisz ten układ w innym układzie za pomocą tagu <include>
, system zignoruje element <merge>
i umieści 2 przyciski bezpośrednio w układzie zamiast tagu <include>
.
Więcej informacji o <include>
znajdziesz w artykule Zasoby układu.