在Shape Drawable中无法识别颜色状态列表

时间:2011-11-17 14:58:30

标签: android colors xml-drawable statelistdrawable shapedrawable

我定义了以下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.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内使用ShapeDrawable资源或我做错了,是否真的丢失了颜色状态信息?

3 个答案:

答案 0 :(得分:25)

ColorStateList无法作为<solid>的属性在XML定义中传递,或者实际上是<shape>的任何属性。此属性作为Color资源从XML中膨胀出来,然后传递给Drawable的setColor()方法,该方法只需要一个ARGB值。

只有一种类型的Drawable实例可以根据状态包含和显示多个项目,这是StateListDrawable,这是您在膨胀<selector>时获得的内容。所有其他Drawable实例仅仅是该集合的成员或独立绘制的。

另请注意,虚增的<shape>项目实际上是GradientDrawable,而不是ShapeDrawable。如果您查看inflate() in the sourceGradientDrawable方法,则可以获得有关如何使用每个属性的所有详细信息。

HTH!

答案 1 :(得分:2)

事实上,您可以在ColorStateList - &gt;的xml中指定一个shape作为纯色。 GradientDrawable,但这只是new feature in Lollipop

Older versions of GradientDrawable仅接受色彩资源。

如果您有兴趣,目前正致力于改造替代品。

答案 2 :(得分:-4)

你做错了......只需替换这个

   android:color="@color/color_stateful"

android:background="@color/color_stateful"

更新

在后台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>