Ist das Android-XML-Layout 'include' Tag wirklich funktionieren?

Ich bin nicht in der Lage, Attribute zu überschreiben, wenn ich <include> in meinen Android-Layout-Dateien verwende. Als ich nach Bugs suchte, fand ich Declined Issue 2863 :

"Include-Tag ist defekt (übergeordnete Layout-Params funktioniert nie)"

Da Romain dies in den Test-Suiten und seinen Beispielen anzeigt, muss ich etwas falsch machen.

Mein Projekt ist so organisiert:

res/layout buttons.xml res/layout-land receipt.xml res/layout-port receipt.xml 

Die buttons.xml enthält so etwas wie dieses:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <Button .../> <Button .../> </LinearLayout> 

Und das Portrait und die Landschaft receipt.xml Dateien sehen so aus wie:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> ... <!-- Overridden attributes never work. Nor do attributes like the red background, which is specified here. --> <include android:id="@+id/buttons_override" android:background="#ff0000" android:layout_width="fill_parent" layout="@layout/buttons"/> </LinearLayout> 

Was vermisse ich?

  • Kontrollieren Sie Android TextView Sichtbarkeit Laufzeit programmatisch
  • Wie lade ich ein PopupWindow oder Dialog aus einem Eingabemethodendienst?
  • Android, wie man ActionBar searchView fokussiert
  • Weird Verhalten von drawableRight für Switch
  • Widget onUpdate, onReceive
  • DateTime Picker in Android Anwendung
  • Wie mache ich eine Toolleiste (wie eine sekundäre Aktionsleiste) in Android?
  • Bestimmen Sie, wann ein ViewPager Seiten ändert
  • 3 Solutions collect form web for “Ist das Android-XML-Layout 'include' Tag wirklich funktionieren?”

    Ich habe das Problem nur gefunden. Zuerst können Sie nur Layout_ * Attribute überschreiben, also wird der Hintergrund nicht funktionieren. Das ist dokumentiertes Verhalten und einfach nur ein Versehen auf meiner Seite.

    Das eigentliche Problem findet sich in LayoutInflater.java:

     // We try to load the layout params set in the <include /> tag. If // they don't exist, we will rely on the layout params set in the // included XML file. // During a layoutparams generation, a runtime exception is thrown // if either layout_width or layout_height is missing. We catch // this exception and set localParams accordingly: true means we // successfully loaded layout params from the <include /> tag, // false means we need to rely on the included layout params. ViewGroup.LayoutParams params = null; try { params = group.generateLayoutParams(attrs); } catch (RuntimeException e) { params = group.generateLayoutParams(childAttrs); } finally { if (params != null) { view.setLayoutParams(params); } } 

    Wenn das <include> -Tag nicht sowohl layout_width als auch layout_height enthält, tritt die RuntimeException auf und wird stillschweigend behandelt, ohne jede Log-Anweisung sogar.

    Die Lösung besteht darin, bei der Verwendung des <include> -Tags immer sowohl layout_width als auch layout_height einzuschließen, wenn Sie die Attribute layout_ * überschreiben möchten.

    Mein Beispiel soll sich ändern:

     <include android:id="@+id/buttons_override" android:layout_width="fill_parent" android:layout_height="wrap_content" layout="@layout/buttons"/> 

    Ich habe eine Erweiterungsanforderung eingereicht , damit alle enthaltenen Attribute überschrieben werden können:

    Angenommen, ich habe zwei identische Layouts außer den Werten eines TextView Feldes. Gegenwärtig habe ich entweder das Layout zur Laufzeit modifiziert oder das XML duplizieren.

    Um beispielsweise zwei Parameter mit den Werten "hallo" und "welt" an layout1 zu übergeben:

    <include layout="@layout/layout1a" params="textView=hello|editText=world" />

    Layout1a.xml:

    <merge><TextView text="@param/textView"><EditText hint="@param/editText"></merge>

    Eine alternative Implementierung würde die Kapselung brechen und würde die Include-Anweisung erlauben, Werte wie:

    <include layout="@layout/layout1b" overrides="@id/textView.text=hello|@id/editText.hint=world" />

    Layout1b.xml:

    <merge><TextView id="@+id/textView"><EditText hint="@+id/editText"></merge>

    Ich fand, dass ich manchmal vermisse, einschließlich der android: id-Tag, wenn ich den GUI-Builder in Eclipse verwende. Sich sicher (wenn ich merke), dass ich in eine TextView aus dem Builder, die ID, die ich bin in der ListView-Layout.

     <TextView android:text="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ... 

    wird

     <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ... 

    Anstatt 'falsch' 'false' zu bekommen, bekomme ich 🙂 und beinhaltet das Arbeiten ok.

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.