13

我定义了以下可绘制对象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.xml为我的形状定义的颜色的任何变化,而视图状态实际上发生了变化(selector_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那么,当在 a 中使用资源时,颜色状态信息是否真的丢失了,ShapeDrawable或者我做错了?

4

3 回答 3

25

AColorStateList不能作为<solid>XML 定义中的属性传递,或者实际上是 a 的任何属性<shape>。此属性作为 Color 资源从 XML 中扩展出来,然后传递给 Drawable 的setColor()方法,该方法只接受一个 ARGB 值。

只有一种类型的 Drawable 实例旨在包含和呈现基于状态的多个项目,StateListDrawable<selector>. 所有其他 Drawable 实例都只是该集合的成员或独立绘制。

另请注意,膨胀的<shape>项目实际上是 aGradientDrawable而不是 a ShapeDrawable。如果您查看源代码中inflate()的方法,您可以获得有关如何使用每个属性的所有详细信息。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 回答