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

Posted

技术标签:

【中文标题】在 android.support.v7.widget.GridLayout 中使用 <include> 无法正确显示【英文标题】:Using <include> in android.support.v7.widget.GridLayout not displaying correctly 【发布时间】:2016-07-24 02:24:17 【问题描述】:

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

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_
    android:layout_
    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_
    android:layout_
    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>

如果我直接在&lt;include&gt;s 上声明所有属性,这就是它在 XML 中的样子:

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

正如您在下面的比较图片中看到的那样,按钮现在可以正确缩放,但看不到图片。

如果我将&lt;include&gt;s 更改为ImageButton,一切都会按预期进行。

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

有解决办法吗?

由于我的拨号盘中将有 12 个几乎相同的按钮,我真的很想通过包含一个“模板”来清理 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】:

也许您可以使用样式来声明公共属性,然后为每个按钮设置它。

<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 个具有该样式的 ImageButton。最终结果是这样的:

【讨论】:

好建议,可惜没用。我应用样式的视图均未显示。更奇怪的是,即使我只将样式应用于其中一个视图,也只会显示 GridLayout 中的最后一个视图! 请把样式发一下好吗? 我更新了我的答案。检查它现在是否可以:D 它适用于GridLayout,但不适用于android.support.v7.widget.GridLayout。不幸的是,GridLayout 在 API 21 之前不可用,我的目标是 API 14 及更高版本。 如果你只有 12 个按钮,为什么不使用一些嵌套的线性布局呢?这样不行吗?

以上是关于在 android.support.v7.widget.GridLayout 中使用 <include> 无法正确显示的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据