Das Include-Tag
Le site <include>
Tag ermöglicht es Ihnen, Ihr Layout in mehrere Dateien aufzuteilen: Es hilft beim Umgang mit complejo oder eine zu lange Benutzeroberfläche.
Nehmen wir an, Sie teilen Ihr komplexes Layout wie folgt in zwei Include-Dateien 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 müssen Sie schreiben include1.xml
y include2.xml
.
Denken Sie daran, dass die xml aus den Include-Dateien einfach ist entsorgt in Ihrem top_level_activity
Layout zur Rendering-Zeit (ziemlich genau wie die #INCLUDE
Makro für C).
Die Include-Dateien sind ganz normale Layout-xml-Dateien.
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 Sie? Nichts Ausgefallenes. Beachten Sie, dass Sie immer noch den Android-Namensraum deklarieren müssen mit xmlns:android="http://schemas.android.com/apk/res/android
.
Also die gerendert Version von top_level_activity.xml ist:
<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 gibt das richtige Widget zurück (auch wenn dieses Widget in einer anderen Xml-Datei als das Aktivitätslayout deklariert wurde).
Und die Kirsche auf dem Sahnehäubchen: die visueller Editor handhabt die Sache mit Bravour. Das Layout der obersten Ebene wird gerendert mit die xml enthalten.
Die Handlung verdichtet sich
Da es sich bei einer Include-Datei um eine klassische Layout-xml-Datei handelt, bedeutet dies, dass sie ein oberstes Element enthalten muss. Falls Ihre Datei also mehr als ein Widget enthalten muss, müssen Sie ein Layout verwenden.
Nehmen wir an, dass include1.xml
hat jetzt zwei TextView
: ein Layout muss deklariert werden. Wählen wir ein 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>
Le site top_level_activity.xml wird wie folgt wiedergegeben:
<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 der LinearLayout
sind redundant !
In der Tat sind die beiden verschachtelten LinearLayout
sind zwecklos, da die beiden TextView
könnte aufgenommen werden unter layout1
für genau dieselbe Wiedergabe .
Was können wir also tun?
Geben Sie den Merge-Tag ein
Le site <merge>
Tag ist nur ein Dummy-Tag, das ein Element der obersten Ebene darstellt, um diese Art von Redundanzproblemen zu lösen.
Jetzt include1.xml wird:
<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 top_level_activity.xml wird wiedergegeben als:
<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 eingespart und eine überflüssige Ansicht vermieden: Romain Guy schläft schon besser.
Bist du jetzt nicht glücklicher?