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

a.c*_*ch. 12 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>
Run Code Online (Sandbox Code Playgroud)

我还定义了以下颜色状态列表资源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>
Run Code Online (Sandbox Code Playgroud)

当我将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>
Run Code Online (Sandbox Code Playgroud)

因此,当ColorStateList资源在a中使用ShapeDrawable或者我做错了时,颜色状态信息是否真的丢失了?

Dev*_*red 25

A ColorStateList不能作为<solid>XML定义中的属性传递,也不能传递给任何属性<shape>.此属性作为Color资源从XML中膨胀,然后传递给Drawable的setColor()方法,该方法只接受一个ARGB值.

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

另请注意,膨胀<shape>物品实际上是a GradientDrawable而不是a ShapeDrawable.如果您查看源代码中inflate()方法,则可以获得有关如何使用每个属性的所有详细信息.GradientDrawable

HTH!

  • 从Android Lollipop开始,这不再是真的,并且正确解析了'ColorStateList`. (8认同)
  • 前棒棒糖设备的明显(和可怕)替代方案是创建与状态一样多的`<shape>,每个只有不同的`<solid>``color`属性,并替换原来的`< shape>`由`StateListDrawable`绘制,引用每个`<shape>`.只使用`<shape>`元素中的资源引用(没有硬编码值)可以略微减轻事物的暴行,并且还可以将原始`<shape>`保存在`drawable-v21`目录中(可能完全切换到以后)._blargh_ (7认同)