<merge/>
Dies ist nützlich, da nicht benötigte ViewGroups entfernt werden können, dh Layouts, die einfach zum Umschließen anderer Ansichten verwendet werden und selbst keinen Zweck erfüllen.
Wenn Sie beispielsweise <include/>
ein Layout aus einer anderen Datei ohne Zusammenführung verwenden, sehen die beiden Dateien möglicherweise folgendermaßen aus:
layout1.xml:
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
was funktional diesem einzelnen Layout entspricht:
<FrameLayout>
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
</FrameLayout>
Das FrameLayout in layout2.xml ist möglicherweise nicht nützlich. <merge/>
hilft, es loszuwerden. So sieht es mit Merge aus (layout1.xml ändert sich nicht):
layout2.xml:
<merge>
<TextView />
<TextView />
</merge>
Dies entspricht funktional diesem Layout:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
Da Sie jedoch verwenden <include/>
, können Sie das Layout an anderer Stelle wiederverwenden. Es muss nicht verwendet werden, um nur FrameLayouts zu ersetzen. Sie können es verwenden, um jedes Layout zu ersetzen, das der Darstellung / dem Verhalten Ihrer Ansicht nichts Nützliches hinzufügt.
<TextView />
nichts anderes enthält.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 :
Dann musst du schreiben
include1.xml
undinclude2.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 :
... und include2.xml :
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:
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 zweiTextView
: Ein Layout muss deklariert werden. Lassen Sie uns eine wählenLinearLayout
.include1.xml :
Die Datei top_level_activity.xml wird wie folgt gerendert:
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:
und jetzt wird top_level_activity.xml wie folgt gerendert:
Sie haben eine Hierarchieebene gespeichert, vermeiden Sie eine nutzlose Ansicht: Romain Guy schläft bereits besser.
Bist du jetzt nicht glücklicher?
quelle
RelativeLayout
die Ansichten möglicherweise manuell verwenden oder zeichnenblazeroni hat es schon ziemlich deutlich gemacht, ich möchte nur ein paar punkte hinzufügen.
<merge>
wird zur Optimierung von Layouts verwendet. Es wird zur Reduzierung unnötiger Verschachtelungen verwendet.<merge>
Tag zu einem anderen Layout hinzugefügt wird, wird der<merge>
Knoten entfernt und seine untergeordnete Ansicht direkt dem neuen übergeordneten Element hinzugefügt.quelle
Um genauer zu wissen, was passiert, habe ich das folgende Beispiel erstellt. Schauen Sie sich die Dateien activity_main.xml und content_profile.xml an .
activity_main.xml
content_profile.xml
Hier sieht die gesamte Layoutdatei im aufgeblasenen Zustand so aus.
Stellen Sie sicher, dass sich im übergeordneten LinearLayout ein LinearLayout befindet, das keinen Zweck erfüllt und redundant ist. Ein Blick auf das Layout mit dem Layout Inspector-Tool erklärt dies deutlich.
content_profile.xml nach dem Aktualisieren des Codes, um Merge anstelle einer ViewGroup wie LinearLayout zu verwenden.
Jetzt sieht unser Layout so aus
Hier sehen wir, dass die redundante LinearLayout ViewGroup entfernt wird. Das Layout Inspector-Tool bietet jetzt die folgende Layouthierarchie.
Versuchen Sie daher immer, die Zusammenführung zu verwenden, wenn Ihr übergeordnetes Layout Ihre untergeordneten Layouts positionieren kann, oder verwenden Sie die Zusammenführung genauer, wenn Sie verstehen, dass es in der Hierarchie eine redundante Ansichtsgruppe geben wird.
quelle
Ein weiterer Grund für die Verwendung der Zusammenführung ist die Verwendung benutzerdefinierter Ansichtsgruppen in ListViews oder GridViews. Anstatt das viewHolder-Muster in einem Listenadapter zu verwenden, können Sie eine benutzerdefinierte Ansicht verwenden. Die benutzerdefinierte Ansicht würde eine XML aufblasen, deren Stamm ein Zusammenführungs-Tag ist. Code für Adapter:
Hier ist die benutzerdefinierte Ansichtsgruppe:
und hier ist das XML:
quelle