3

J'essaie d'utiliser <include> pour inclure ImageButton s à l'intérieur d'un android.support.v7.widget.GridLayout. Le problème est que si je ne spécifie pas explicitement tous les attributs sur mes éléments <include>, ils ne s'affichent pas correctement. En d'autres termes, l'inclusion est inutile puisque je dois redéclarer tous les attributs sur chaque élément <include>.En utilisant <include> dans android.support.v7.widget.GridLayout ne s'affiche pas correctement

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> 

Si je déclare tous les attributs directement sur les <include> s, voici à quoi il ressemble en XML:

<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" /> 

Comme vous pouvez le voir dans l'image de comparaison ci-dessous, les boutons évoluent maintenant correctement mais les images ne sont visibles nulle part.

Et si je change le <include> s en ImageButton, les choses fonctionnent comme prévu.

<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

est-il une solution à cela? Comme je vais avoir 12 boutons presque identiques dans mon clavier, je voudrais vraiment nettoyer le XML en incluant un "template" et en ne modifiant que les attributs nécessaires pour chaque bouton (ie src et id).

EDIT

Essayer d'utiliser les styles, comme le suggère dans une réponse, ne fonctionnait pas. Aucune des vues auxquelles j'ai appliqué les styles à afficher. Ce qui est encore plus étrange, même si je n'applique le style à l'une des vues dans le GridLayout, seule la dernière vue est affichée (j'ai raccourci l'exemple de code ici à seulement deux vues pour la lisibilité, en réalité j'en ai douze) .

Voici le style que j'ai essayé d'utiliser:

<?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> 

Répondre

0

Peut-être que vous pouvez utiliser un style de déclarer les attributs communs puis définissez pour chaque bouton.

<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> 

J'ai aussi ajouté: columnCount à 3 et à 4 rowCount pour GridLayout et ajouté 12 ImageButtons avec ce style. Le résultat final est le suivant: enter image description here

+0

Bonne suggestion, malheureusement cela n'a pas fonctionné. Aucune des vues auxquelles j'applique les styles n'est affichée. Encore plus étrange est que même si j'applique le style à seulement une des vues, seule la dernière vue dans le GridLayout est affichée! – BadCash

+0

Pouvez-vous poster le style, s'il vous plaît? –

+0

J'ai mis à jour la question. – BadCash