3

Ich versuche <include> zu verwenden, um ImageButton s innerhalb einer android.support.v7.widget.GridLayout zu enthalten. Das Problem ist, wenn ich nicht alle Attribute explizit auf meinen <include> Elementen angeben, werden sie nicht ordnungsgemäß angezeigt. Mit anderen Worten, das Include ist sinnlos, da ich alle Attribute auf jedem Element neu deklarieren muss.Verwenden von <include> in android.support.v7.widget.GridLayout nicht korrekt angezeigt

dialpad_button.xml

<?xml version="1.0" encoding="utf-8"?> 
<ImageButton 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:grid="http://schemas.android.com/apk/res-auto" 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    grid:layout_columnWeight="1" 
    grid:layout_rowWeight="1" 
    grid:layout_gravity="fill" 
    android:layout_margin="5dp" 
    android:scaleType="centerInside"/> 

dialpad_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.GridLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:grid="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/dialpad_grid_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerHorizontal="true" 
    grid:alignmentMode="alignBounds" 
    grid:columnCount="2" 
    grid:rowCount="1"> 

    <include 
     android:id="@+id/dialpad_view_btn1" 
     android:src="@drawable/dialpad_1" 
     layout="@layout/dialpad_button" /> 

    <include 
     android:id="@+id/dialpad_view_btn2" 
     android:src="@drawable/dialpad_2" 
     layout="@layout/dialpad_button" /> 


</android.support.v7.widget.GridLayout> 

Wenn ich alle Attribute direkt auf den <include> s erklären, hier ist, wie es in XML aussieht:

<include 
     layout="@layout/dialpad_button" 
     android:id="@+id/dialpad_view_btn1" 
     android:src="@drawable/dialpad_1" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     grid:layout_columnWeight="1" 
     grid:layout_rowWeight="1" 
     grid:layout_gravity="fill" 
     android:layout_margin="5dp" 
     android:scaleType="centerInside" /> 

Wie Sie im unten stehenden Vergleichsbild sehen können, skalieren die Schaltflächen jetzt richtig, aber die Bilder sind nirgendwo zu sehen. Wenn ich die <include> s zu ImageButton ändere, funktionieren die Dinge wie erwartet.

<ImageButton 
     android:id="@+id/dialpad_view_btn1" 
     android:src="@drawable/dialpad_1" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     grid:layout_columnWeight="1" 
     grid:layout_rowWeight="1" 
     grid:layout_gravity="fill" 
     android:layout_margin="5dp" 
     android:scaleType="centerInside" /> 

Comparison of different XML-layouts

Gibt es eine Abhilfe für dieses?

Da ich 12 fast identische Tasten in meinem Wähltasten haben möchte, möchte ich das XML wirklich aufräumen, indem ich eine "Vorlage" einfüge und nur die erforderlichen Attribute für jede Taste (src und id) modifiziere).

EDIT

Der Versuch, Stile zu verwenden, wie es in einer Antwort vorgeschlagen, hat nicht funktioniert. Keine der Ansichten, auf die ich die Stile angewendet habe, um angezeigt zu werden. Was noch seltsamer ist, selbst wenn ich den Stil nur auf eine der Ansichten in der GridLayout anwende, wird nur die letzte Ansicht angezeigt (ich habe den Beispielcode hier auf nur zwei Ansichten für die Lesbarkeit verkürzt, in Wirklichkeit habe ich zwölf) .

Hier ist der Stil, den ich versuchte mit:

<?xml version="1.0" encoding="utf-8"?> 
<resources 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:grid="http://schemas.android.com/apk/res-auto" > 

    <style name="dialPadButtonStyle"> 
     <item name="android:layout_width">0dp</item> 
     <item name="android:layout_height">0dp</item> 
     <item name="grid:layout_columnWeight">1</item> 
     <item name="grid:layout_rowWeight">1</item> 
     <item name="grid:layout_gravity">fill</item> 
     <item name="android:layout_margin">5dp</item> 
     <item name="android:scaleType">centerInside</item> 
     <item name="android:background">@android:color/transparent</item> 
    </style> 
</resources> 

Antwort

0

Vielleicht können Sie einen Stil verwenden, um die gemeinsame Eigenschaften zu erklären und es dann für jede Taste eingestellt.

<style name="dialPadButtonStyle"> 
    <item name="android:layout_width">0dp</item> 
    <item name="android:layout_height">0dp</item> 
    <item name="android:layout_columnWeight">1</item> 
    <item name="android:layout_rowWeight">1</item> 
    <item name="android:layout_margin">5dp</item> 
    <item name="android:src">@android:drawable/ic_menu_camera</item> 
</style> 

Ich habe auch: column bis 3 und rowCount bis 4 für Gridlayout und hinzugefügt 12 ImageButtons mit diesem Stil. Das Endergebnis ist das: enter image description here

+0

Guter Vorschlag, leider hat es nicht funktioniert. Keine der Ansichten, auf die ich die Stile anwende, wird angezeigt. Noch seltsamer ist, dass selbst wenn ich den Stil nur auf eine der Ansichten anwende, nur die letzte Ansicht im GridLayout angezeigt wird! – BadCash

+0

Kannst du bitte den Style posten? –

+0

Ich habe die Frage aktualisiert. – BadCash