Il tag include
Il <include>
tag consente di dividere il layout in più file: aiuta a gestire complessi l'interfaccia utente o troppo lunga.
Supponiamo di dividere il layout complesso usando due file include come segue:
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>
Quindi devi scrivere include1.xml
e include2.xml
.
Tieni presente che il file XML dai file include viene semplicemente scaricato nel top_level_activity
layout al momento del rendering (in modo molto simile alla #INCLUDE
macro per C).
I file include sono xml di layout jane semplici.
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"/>
... e include2.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" />
Vedere? Nulla di bello. Nota che devi ancora dichiarare lo spazio dei nomi Android con xmlns:android="http://schemas.android.com/apk/res/android
.
Quindi la versione renderizzata di 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 -->
<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>
Nel tuo codice java, tutto questo è trasparente: findViewById(R.id.textView1)
nella tua classe di attività restituisce il widget corretto (anche se quel widget è stato dichiarato in un file xml diverso dal layout dell'attività).
E la ciliegina sulla torta: l' editor visuale gestisce la cosa a meraviglia. Viene visualizzato il layout di livello superiore con l'xml incluso.
La trama si infittisce
Poiché un file include è un file xml di layout classico, significa che deve avere un elemento superiore. Pertanto, nel caso in cui il file debba includere più di un widget, è necessario utilizzare un layout.
Diciamo che include1.xml
ora ha due TextView
: un layout deve essere dichiarato. Scegliamo a 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>
Il top_level_activity.xml sarà tradotto in:
<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>
Ma aspetta che i due livelli di LinearLayout
siano ridondanti !
In effetti, i due nidificati LinearLayout
non servono a nulla in quanto i due TextView
potrebbero essere inclusi esattamentelayout1
per lo stesso rendering .
Quindi cosa possiamo fare?
Immettere il tag di unione
Il <merge>
tag è solo un tag fittizio che fornisce un elemento di livello superiore per affrontare questo tipo di problemi di ridondanza.
Ora include1.xml diventa:
<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>
e ora top_level_activity.xml viene visualizzato come:
<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>
Hai salvato un livello gerarchico, evita una visione inutile: Romain Guy dorme già meglio.
Non sei più felice adesso?
<TextView />
nient'altro.