Tag dołączania
<include>
Tag pozwala dzielić swój układ na wiele plików: pomaga do czynienia ze skomplikowanym lub zbyt długie interfejsu użytkownika.
Załóżmy, że podzieliłeś swój złożony układ za pomocą dwóch plików dołączanych w następujący sposób:
top_level_activity.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<include layout="@layout/include1.xml" />
<!-- Second include file -->
<include layout="@layout/include2.xml" />
</LinearLayout>
Następnie musisz napisać include1.xml
i include2.xml
.
Należy pamiętać, że plik XML z plików dołączanych jest po prostu zrzucany w top_level_activity
układzie podczas renderowania (podobnie jak #INCLUDE
makro dla C).
Pliki dołączane to zwykły układ jane xml.
include1.xml :
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
... i dołącz plik 2.xml :
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button1"
android:text="Button" />
Widzieć? Nic fajnego. Pamiętaj, że nadal musisz zadeklarować przestrzeń nazw Androida xmlns:android="http://schemas.android.com/apk/res/android
.
Więc wygenerowana wersja top_level_activity.xml jest:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
W kodzie java wszystko to jest przezroczyste: findViewById(R.id.textView1)
w twojej klasie aktywności zwraca poprawny widget (nawet jeśli ten widget został zadeklarowany w pliku xml innym niż układ aktywności).
A wisienka na górze: edytor wizualny radzi sobie z tym płynnie. Układ najwyższego poziomu jest renderowany z dołączonym plikiem XML.
Fabuła gęstnieje
Ponieważ plik dołączany jest plikiem XML w klasycznym układzie, oznacza to, że musi mieć jeden górny element. Jeśli więc plik musi zawierać więcej niż jeden widżet, musisz użyć układu.
Powiedzmy, że include1.xml
teraz są dwa TextView
: należy zadeklarować układ. Wybierzmy LinearLayout
.
include1.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
Plik top_level_activity.xml będzie renderowany jako:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<LinearLayout
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Ale poczekaj dwa poziomy LinearLayout
są zbędne !
Rzeczywiście, dwa zagnieżdżone LinearLayout
nie służą żadnemu celowi, ponieważ dwa TextView
mogą być uwzględnione layout1
dla dokładnie tego samego renderowania .
Więc co możemy zrobić?
Wpisz tag scalania
<merge>
Tag tag tylko manekin, który stanowi element najwyższego poziomu do czynienia z tego rodzaju zagadnień związanych ze zwolnieniem.
Teraz include1.xml staje się:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</merge>
a teraz top_level_activity.xml jest renderowany jako:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Zapisałeś jeden poziom hierarchii, unikaj jednego niepotrzebnego widoku: Romain Guy już lepiej śpi.
Nie jesteś teraz szczęśliwszy?
<TextView />
, nic więcej.