Подтвердить что ты не робот

Список состояний цвета не распознан в форме 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, или я делаю это неправильно?

4b9b3361

Ответ 1

A ColorStateList не может быть передан как атрибут для <solid> в определении XML или действительно какой-либо атрибут <shape>. Этот атрибут раздувается из XML как ресурс цвета, а затем передается методу Drawable setColor(), который принимает только одно значение ARGB.

Существует только один тип экземпляра Drawable, который предназначен для размещения и представления нескольких элементов на основе состояния, а это StateListDrawable, что вы получаете, когда вы надуваете <selector>. Все остальные экземпляры Drawable предназначены просто для того, чтобы быть членами этой коллекции или отрисовываться автономно.

Обратите также внимание, что надутый элемент <shape> на самом деле является GradientDrawable, а не a ShapeDrawable. Если вы проверите метод inflate() GradientDrawable в источнике, вы можете получить все детали, которые вы могли бы задать, о том, как каждый атрибут используется.

НТН!

Ответ 2

Фактически вы можете назначить ColorStateList как сплошной цвет внутри xml aa shapeGradientDrawable, но это только новая функция в 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>