Das Include-Tag
Mit dem <include>
Tag können Sie Ihr Layout in mehrere Dateien aufteilen: Es hilft beim Umgang mit komplexen oder überlangen Benutzeroberflächen.
Angenommen, Sie teilen Ihr komplexes Layout mithilfe von zwei Include-Dateien wie folgt auf:
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>
Dann musst du schreiben include1.xml
und include2.xml
.
Beachten Sie, dass die XML - Daten aus den Dateien enthalten ist einfach abgeladen in Ihrem top_level_activity
Layout an die Rendering - Zeit (ziemlich ähnlich wie das #INCLUDE
Makro für C).
Die Include-Dateien sind einfache Jane Layout 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"/>
... und 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" />
Sehen? Nichts Besonderes. Beachten Sie, dass Sie den Android-Namespace noch mit deklarieren müssen xmlns:android="http://schemas.android.com/apk/res/android
.
Die gerenderte Version von top_level_activity.xml lautet also:
<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>
In Ihrem Java-Code ist dies alles transparent: findViewById(R.id.textView1)
In Ihrer Aktivitätsklasse wird das richtige Widget zurückgegeben (auch wenn dieses Widget in einer XML-Datei deklariert wurde, die sich vom Aktivitätslayout unterscheidet).
Und die Kirsche an der Spitze: Der visuelle Editor handhabt das Ding schwimmend. Das Layout der obersten Ebene wird mit der enthaltenen XML gerendert .
Die Handlung verdickt sich
Da eine Include-Datei eine klassische Layout-XML-Datei ist, bedeutet dies, dass sie ein oberstes Element enthalten muss. Wenn Ihre Datei also mehr als ein Widget enthalten muss, müssen Sie ein Layout verwenden.
Nehmen wir an, das include1.xml
hat jetzt zwei TextView
: Ein Layout muss deklariert werden. Lassen Sie uns eine wählen 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>
Die Datei top_level_activity.xml wird wie folgt gerendert:
<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>
Aber warten Sie, die beiden Ebenen LinearLayout
sind überflüssig !
In der Tat haben die beiden verschachtelten LinearLayout
Zwecke keinen Zweck, da die beiden für genau dasselbe RenderingTextView
unter aufgenommen werden könnten .layout1
Also was können wir tun?
Geben Sie das Zusammenführungs-Tag ein
Das <merge>
Tag ist nur ein Dummy-Tag, das ein Element der obersten Ebene bietet, um diese Art von Redundanzproblemen zu lösen.
Jetzt wird include1.xml zu:
<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>
und jetzt wird top_level_activity.xml wie folgt gerendert:
<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>
Sie haben eine Hierarchieebene gespeichert, vermeiden Sie eine nutzlose Ansicht: Romain Guy schläft bereits besser.
Bist du jetzt nicht glücklicher?
<TextView />
nichts anderes enthält.