3

Я пытаюсь использовать <include>, чтобы включить ImageButton s внутри android.support.v7.widget.GridLayout. Проблема в том, что если я не укажу все атрибуты явно на своих <include> элементах, они не отображаются должным образом. Другими словами, включение бессмысленно, так как я должен обновлять все атрибуты на каждом элементе <include>.Использование <include> в android.support.v7.widget.GridLayout отображается неправильно

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> 

Если я объявляю все атрибуты непосредственно на <include> с, вот как это выглядит в 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" /> 

Как вы можете видеть на сравнительном изображении ниже, кнопки теперь масштабируются правильно, но изображения нигде не видны.

И если я изменю <include> s на ImageButton, все будет работать должным образом.

<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

Есть обходной путь для этого?

Поскольку у меня будет 12 почти идентичных кнопок на моем dialpad, я бы очень хотел очистить XML, включив «шаблон» и только изменяя необходимые атрибуты для каждой кнопки (то есть и id).

EDIT

Попытка использовать стили, как это было предложено в одном ответе, не работает. Ни один из представлений, которые я применил стили для отображения. Что еще более странно, даже если я просто применил стиль к одному из представлений в GridLayout, отобразится только последнее представление (я сократил здесь пример кода до двух видов для удобочитаемости, на самом деле у меня двенадцать) ,

Вот стиль, который я попытался с помощью:

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

ответ

0

Может быть, вы можете использовать стиль объявить общие атрибуты, а затем установить его для каждой кнопки.

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

Я также добавил: ColumnCount 3 и сверку 4 для GridLayout и добавил 12 ImageButtons с этим стилем. Конечным результатом является следующее: enter image description here

+0

Хорошее предложение, к сожалению, не получилось. Отображаются ни одно из представлений, в которых я применяю стили. Еще страннее то, что даже если я применяю стиль только к одному из представлений, отображается только последний вид в GridLayout! – BadCash

+0

Можете ли вы опубликовать стиль, пожалуйста? –

+0

Я обновил вопрос. – BadCash

Смежные вопросы