3

内に s<include>を含めるために使用しようとしています。問題は、要素にすべての属性を明示的に指定しないと、正しく表示されないことです。つまり、すべての要素のすべての属性を再宣言する必要があるため、インクルードは無意味です。ImageButtonandroid.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>

すべての属性を s で直接宣言すると<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" />

異なる XML レイアウトの比較

これに対する回避策はありますか?

srcダイヤルパッドに 12 個のほぼ同一のボタンを配置する予定なので、「テンプレート」を含め、各ボタンに必要な属性 (つまりと)のみを変更して、XML をクリーンアップしたいと考えていますid

編集

ある回答で提案されているように、スタイルを使用しようとしてもうまくいきませんでした。スタイルを適用して表示されるビューはありません。さらに奇妙なことに、 のビューの 1 つにスタイルを適用したGridLayoutだけでも、最後のビューしか表示されません (ここでは、読みやすくするためにサンプル コードを 2 つのビューに短縮しましたが、実際には 12 あります)。

これが私が使用してみたスタイルです:

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

1 に答える 1