Список состояний цветов не распознается в Shape Drawable - PullRequest
12 голосов
/ 17 ноября 2011

Я определяю следующее 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 ]

25 голосов
/ 17 ноября 2011

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

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

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

НТН!

2 голосов
/ 20 марта 2015

На самом деле вы можете назначить ColorStateList как сплошной цвет внутри xml shape -> GradientDrawable, но это только новая функция в Lollipop .

Более старые версии GradientDrawable допускают только цветовые ресурсы.

В настоящее время, если вам интересно, работает над альтернативой компата.

0 голосов
/ 17 ноября 2011

Вы делаете это, выкручивая .... просто замените это

   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>
...