我定义了以下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
资源或我做错了,是否真的丢失了颜色状态信息?
答案 0 :(得分:25)
ColorStateList
无法作为<solid>
的属性在XML定义中传递,或者实际上是<shape>
的任何属性。此属性作为Color资源从XML中膨胀出来,然后传递给Drawable的setColor()
方法,该方法只需要一个ARGB值。
只有一种类型的Drawable实例可以根据状态包含和显示多个项目,这是StateListDrawable
,这是您在膨胀<selector>
时获得的内容。所有其他Drawable实例仅仅是该集合的成员或独立绘制的。
另请注意,虚增的<shape>
项目实际上是GradientDrawable
,而不是ShapeDrawable
。如果您查看inflate()
in the source的GradientDrawable
方法,则可以获得有关如何使用每个属性的所有详细信息。
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>