Список состояний цвета не распознан в форме Drawable
Я определяю следующий 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
, или я делаю это неправильно?
Ответы
Ответ 1
A ColorStateList
не может быть передан как атрибут для <solid>
в определении XML или действительно какой-либо атрибут <shape>
. Этот атрибут раздувается из XML как ресурс цвета, а затем передается методу Drawable setColor()
, который принимает только одно значение ARGB.
Существует только один тип экземпляра Drawable, который предназначен для размещения и представления нескольких элементов на основе состояния, а это StateListDrawable
, что вы получаете, когда вы надуваете <selector>
. Все остальные экземпляры Drawable предназначены просто для того, чтобы быть членами этой коллекции или отрисовываться автономно.
Обратите также внимание, что надутый элемент <shape>
на самом деле является GradientDrawable
, а не a ShapeDrawable
. Если вы проверите метод inflate()
GradientDrawable
в источнике, вы можете получить все детали, которые вы могли бы задать, о том, как каждый атрибут используется.
НТН!
Ответ 2
Фактически вы можете назначить ColorStateList
как сплошной цвет внутри xml aa shape
→ GradientDrawable
, но это только новая функция в Lollipop.
Старые версии GradientDrawable
принимают только цветовые ресурсы.
В настоящее время мы работаем над альтернативой сравнения, если вы заинтересованы.
Ответ 3
Вы делаете это сжимаете.... просто замените это
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>