在android.support.v7.widget.GridLayout中使用<include>无法正确显示

时间:2016-04-04 13:44:50

标签: android android-layout android-xml android-gridlayout android-include

我尝试使用<include>ImageButton包含在android.support.v7.widget.GridLayout中。问题是,如果我没有在<include>元素上明确指定所有属性,则它们无法正常显示。换句话说,包含是没有意义的,因为我必须重新声明每个<include>元素上的所有属性。

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>更改为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个几乎相同的按钮,我真的很想通过添加一个&#34;模板来清理XML。并且只修改每个按钮的必要属性(即srcid)。

修改

如一个答案所示,尝试使用样式不起作用。我没有应用样式来显示的视图。甚至更奇怪的是,即使我只将样式应用于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>

1 个答案:

答案 0 :(得分: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>

我还为GridLayout添加了:columnCount为3,rowCount为4,并添加了12个带有该样式的ImageButtons。最终结果如下: enter image description here