Ich habe seit einigen Tagen versucht, meine Layouts effizienter zu gestalten, indem ich mehrere verschachtelte Ebenen LinearLayouts
in eine umwandelte , RelativeLayout
und bin auf einige Probleme gestoßen, für die ich keine Problemumgehung gefunden habe ...
Ich habe die Android-Anfängergruppe und diese Website durchsucht und konnte nichts finden, was mir bei der Lösung des Problems helfen könnte.
Ich habe in einem der Blogs gelesen, dass Sie Layouts mit Zusammenführen kombinieren und Tags einschließen können. Ich habe also eine Hauptlayoutdatei mit einem RelativeLayout
Stammelement. Darin befinden sich 5 Include-Tags, die auf 5 verschiedene XML-Layoutdateien verweisen, die jeweils ein Zusammenführungselement für das Stammverzeichnis enthalten (alle meine Zusammenführungsdateien sind bis auf die darin enthaltenen IDs identisch).
Ich habe zwei Probleme, die ich nach der Veröffentlichung einer vereinfachten Version meines Layout-Codes erläutern werde:
Beispiel für eine Hauptlayoutdatei:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/translucent_gray" >
<include
android:id="@+id/running_gallery_layout_id"
layout="@layout/running_gallery_layout" />
<include
android:id="@+id/recent_gallery_layout_id"
layout="@layout/recent_gallery_layout"
android:layout_below="@id/running_gallery_layout_id" />
<include
android:id="@+id/service_gallery_layout_id"
layout="@layout/service_gallery_layout"
android:layout_below="@id/recent_gallery_layout_id" />
<include
android:id="@+id/process_gallery_layout_id"
layout="@layout/process_gallery_layout"
android:layout_below="@id/service_gallery_layout_id" />
</RelativeLayout>
Beispiel enthaltene Zusammenführungsdatei:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
style="@style/TitleText"
android:id="@+id/service_gallery_title_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="@string/service_title" />
<Gallery
android:id="@+id/service_gallery_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_below="@id/service_gallery_title_text_id" />
<TextView
style="@style/SubTitleText"
android:id="@+id/service_gallery_current_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/service_gallery_title_text_id"
android:layout_above="@id/service_gallery_id" />
</merge>
Ich habe zwei Probleme:
1) Die android:layout_*
Attribute scheinen ignoriert zu werden, wenn sie im Include-Tag verwendet werden, und alle zusammengeführten Layouts werden übereinander angezeigt. Laut diesem Beitrag ( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) "kann jedes android:layout_*
Attribut mit dem <include />
Tag verwendet werden"
2) Da dies nicht funktionieren konnte, habe ich beschlossen, android:layout_below
dem ersten TextView
Element in jeder Zusammenführungslayoutdatei ein Attribut hinzuzufügen , was bedeutet, dass jede Zusammenführungsdatei auf eine ID aus einer anderen Zusammenführungslayoutdatei verweist ... Zum größten Teil hat tatsächlich funktioniert und mein Layout sieht gut aus. Bei einem der android:layout_below
Attribute wird jedoch eine Fehlermeldung angezeigt, dass die von mir angegebene ID nicht gefunden werden kann. Ich habe die IDs doppelt und dreifach überprüft, um sicherzustellen, dass sie korrekt sind. Das Seltsamste ist, dass ich die AutoFill
Funktion verwendet habe, um die ID an erster Stelle in das Attribut einzufügen .
Wenn jemand Vorschläge oder Problemumgehungen hat, probiere ich diese gerne aus. Wenn mir jemand eine Möglichkeit einfallen lässt, nur eine XML-Layoutdatei zum Zusammenführen anstelle von 5 zu erstellen, wäre dies sehr dankbar. Ich konnte keinen Weg finden, dies zu tun, da ich zur Laufzeit Zugriff auf jedes Element in den Zusammenführungslayoutdateien haben muss ...
layout_width
und habelayout_height
mich auf mein festgelegt<include>
. Ich habe auch versucht, auflayout_width
undlayout_height
auf meine zu setzen,<merge>
aber ohne Erfolg. Was vermisse ich ?Siehe die höher bewertete Antwort unten. Meins ist absolut veraltet
Ich kann ein Problem ansprechen, das Justin angesprochen hat: Unfähigkeit von RelativeLayout, die Positionierung eines Includes zu verwalten (zumindest in diesem einfachen Fall auf einem 1.6-Emulator)
CommonsWare schlägt vor, die Includes in einen eindeutigen übergeordneten Container zu packen , dies jedoch, um das Adressieren und Scoping von Ansichten mit identischem Namen in Justins Includes zu unterstützen
Tatsächlich müssen Sie dies auch tun , damit sich RelativeLayout wie erwartet verhält:
Dies funktioniert ( Fußzeile ist gut positioniert):
Dies ist nicht der Fall (die Fußzeile schwebt oben auf dem Bildschirm):
Das nackte Fußzeilen- Include wird ohne das umgebende LinearLayout nicht am unteren Rand des übergeordneten Elements ausgerichtet. Ich würde dieses erwartete Verhalten nicht nennen.
Darüber hinaus scheint sich das WebView per ID gut an den Header anzuhängen , aber ich halte dies für eine Illusion, da es einfach vertikal unter dem Header fließt. Ich habe auch versucht, eine Schaltfläche direkt über dem Fußzeilen-Include zu setzen, aber es wurde auch alles schwebend und falsch
RelativeLayout hatte mehr Probleme in 1.5, aber ich mag es immer noch :)
quelle
Mann, das ist alt, aber es scheint ganz oben auf der Suche zu stehen, also werde ich einen Kommentar abgeben.
Ich denke, der Trick hier ist, dass das
<merge>
Tag in Kombination mit dem<include>
Tag im Wesentlichen jede Art von "übergeordneter" Ansichtsgruppe auf dieser Ebene entfernt. Also, wen genau fragst du dann, um jemand anderen "layout_below" zu machen? Niemand. Auf dieser Ebene gibt es keine Sicht.Das
<merge>
Tag nimmt die untergeordneten Ansichten und fügt sie direkt in das übergeordnete Element des<include>
Tags ein. Sie müssen daher die Kinder in dem Layout, das Sie einschließen, bitten, sich entsprechend zu verankern.quelle
Damit die Positionierung in RelativeLayout funktioniert, müssen Sie die Parameter layout_ * in der Include-Datei und nicht in der Hauptlayoutdatei festlegen. Dieser Weg
main_layout.xml
content_layout.xml
Dies ist offensichtlich nicht das, was wir Entwickler wollen, aber es ist die einzige Lösung, die ich gefunden habe, um das Duplizieren von XML zu vermeiden
quelle
Ich vermute, dass Sie anhand von Layoutregeln nicht auf
android:id
Attribute verweisen können, die für<include>
Elemente definiert sind, sondern nur auf Attribute, die sich auf "echten" Widgets und Containern befinden.Einfach: Legen Sie sie alle in eine Datei.
Unabhängig davon, ob Sie ein
<include>
Element oder 1.000 haben, sollte der gesamte Inhalt zur Laufzeit verfügbar sein. Eine Ausnahme ist, wenn Sieandroid:id
Attribute dupliziert haben. Sie müssten IhrefindViewById()
Aufrufe ordnungsgemäß ausführen, um die richtigen zu erhalten, genau wie beim Abrufen von Widgets aus einer ListView-Zeile.Wenn Sie ein Beispielprojekt erstellen können, das 2+ Zusammenführungsdateien verwendet, in denen Sie nachweisen können, dass der Inhalt zur Laufzeit nicht verfügbar ist, lassen Sie es mich wissen.
quelle
Versuchen :
quelle
In meinem Fall beginnt das Layout, das ich einschließen wollte, mit dem
<merge
Tag. Wenn ich es in ein Layout geändert habe, sagen wir,<RelativeLayout
es hat funktioniert. Unten ist die Abbildung.ARBEITEN
FUNKTIONIERT NICHT
quelle
Ich hatte das gleiche Problem und sogar das Definieren
layout_width
undlayout_height
es hat nicht funktioniert. Das Problem war, dass das Layout, das ich einfügte, Tags hatte und nach dem Entfernen alles wie ein Zauber funktionierte. Ich nehme an, dass das Zusammenführen kein Layout-Tag ist und daher keine Positionierungs- und Größenparameter empfangen kann. Da alles, was Sie definieren, in das innere übergeordnete Layout übertragen wird, wurden die Einstellungen einfach weggeworfen.TL: DR: Entfernen Sie einfach die Tags, verschieben Sie die XMLNS-Definitionen in einen echten Layout-Ansichtshalter, und Sie sollten gut sein.
Vor:
Arbeiten:
quelle