Я пытаюсь использовать <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" />
Есть обходной путь для этого?
Поскольку у меня будет 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>
Хорошее предложение, к сожалению, не получилось. Отображаются ни одно из представлений, в которых я применяю стили. Еще страннее то, что даже если я применяю стиль только к одному из представлений, отображается только последний вид в GridLayout! – BadCash
Можете ли вы опубликовать стиль, пожалуйста? –
Я обновил вопрос. – BadCash