13

次の drawable を定義しますmy_background_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:gravity="center"
            android:shape="rectangle">
            <solid android:color="@color/color_stateful" />
        </shape>
    </item>

    <item android:drawable="@drawable/selector_png_drawable" />
</layer-list>

また、次の色状態リスト リソースも定義しますcolor_stateful.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:color="#FF00ff00"/>
    <item android:color="#FFff0000"/>
</selector>

いくつかのビューの背景として与えられたものを設定すると、ビューの状態が実際に変更されている間、形状にmy_background_drawable定義されている色の変化を観察できません(はインジケーターです)。color_stateful.xmlselector_png_drawable.xml

ただしmy_background_drawable.xml、次のように変更すると、すべて問題ありません。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- This doesn't work
    <item>
        <shape android:gravity="center"
            android:shape="rectangle">
            <solid android:color="@color/color_stateful" />
        </shape>
    </item>
-->
    <item>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:state_pressed="true">
                <shape android:gravity="center"
                    android:shape="rectangle">
                    <solid android:color="#FF00ff00" />
                </shape>
            </item>

            <item>
                <shape android:gravity="center"
                    android:shape="rectangle">
                    <solid android:color="#FFff0000" />
                </shape>
            </item>
        </selector>
    </item>

    <item android:drawable="@drawable/selector_png_drawable"" />
</layer-list>

ColorStateListリソースが 内で使用されると、色の状態情報が失われるというのは本当ですか、ShapeDrawableそれとも間違っていますか?

4

3 に答える 3

25

を XML 定義の属性として渡すことはできません。実際には、 の任意の属性ColorStateListです。この属性は、XML から Color リソースとしてインフレートされ、単一の ARGB 値のみを受け取る Drawable のメソッドに渡されます。<solid><shape>setColor()

状態に基づいて複数のアイテムを格納および表示するように設計された Drawable インスタンスのタイプは 1 つだけStateListDrawableです<selector>。他のすべての Drawable インスタンスは、単にこのコレクションのメンバーになるか、スタンドアロンで描画されることを意図しています。

また、膨張した<shape>アイテムは実際にはGradientDrawableではなく であることに注意してくださいShapeDrawablesourceinflate()のメソッドを確認すると、各属性がどのように使用されているかについて必要なすべての詳細を取得できます。GradientDrawable

チッ!

于 2011-11-17T15:19:07.300 に答える
2

実際、aa ->ColorStateListの xml 内で単色として aを割り当てることができますが、これはLollipopの新しい機能にすぎません。shapeGradientDrawable

の古いバージョンはGradientDrawableカラー リソースのみを受け入れます。

興味がある場合は、現在互換性のある代替案に取り組んでいます。

于 2015-03-20T14:40:40.710 に答える
-4

あなたはそれを絞ってやっています....これを交換するだけです

   android:color="@color/color_stateful"

android:background="@color/color_stateful"

アップデート:

my_background_drawable.xmlのプログラムコード内

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:gravity="center"
            android:shape="rectangle">
            <solid android:background="@color/color_stateful" /> <!--this is the chanage i made... here-->
        </shape>
    </item>

    <item android:drawable="@drawable/selector_png_drawable" />
</layer-list>
于 2011-11-17T15:23:44.133 に答える