Android — проблемы с ColorStateList xml, на который ссылается форма xml

Я столкнулся с проблемой, когда селектор цвета в одном из моих рисуемых XML-файлов, похоже, не соблюдается. У меня есть макет, включающий:

<LinearLayout 
    android:layout_height="wrap_content"
    android:id="@+id/sortLayout"
    android:layout_width="fill_parent"
    android:gravity="center"
    android:background="@color/listSortBarBackground" android:orientation="vertical">
    <ToggleButton
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:checked="true"
        android:background="@drawable/filter_button_left"/>
    <ToggleButton
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:checked="false"
        android:background="@drawable/filter_button_left"/>
</LinearLayout>

drawable\filter_button_left.xml выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <solid android:color="@color/filter_button_color" />
  <corners
    android:bottomLeftRadius="0dp"
    android:topLeftRadius="5dp"
    android:topRightRadius="0dp"
    android:bottomRightRadius="5dp"/>
</shape>

и color\filter_button_color.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
  <item
    android:color="@color/myred"
    android:state_checked="true"/>
  <item
    android:color="@color/myblue"
    android:state_checked="false"/>
</selector>

(myred и myblue определены в colors.xml)

Кнопки визуализируются, и я могу сказать, что они получают правильное отмеченное состояние, поскольку первая отображается с текстом «ВКЛ», а вторая — «ВЫКЛ», обе кнопки получают фигуру в качестве фона, но в обоих случаях цвет фигуры мирред. Я поиграл с переворачиванием элементов в селекторе filter_button_color.xml, и кажется, что независимо от фактического состояния или состояний в элементах селектора всегда используется верхний цвет.

Кто-нибудь может понять, почему это не должно работать?

Спасибо! Скотт


person Scott    schedule 09.08.2011    source источник


Ответы (1)


Я думаю, ваша проблема заключается в том, что у вас есть xml drawables неправильно.
Вам нужно обратиться к вашему селектору FIRST из макета ToggleButton, а внутри макета селектора иметь два drawables.
Например, ToggleButton -> Селектор (с двумя состояниями) -> Фигуры.
Это должно работать (и сделать на один XML-файл меньше).

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <shape>
            <solid android:color="@color/myred"/>
            <corners 
                android:bottomLeftRadius="0dp" 
                android:topLeftRadius="5dp" 
                android:topRightRadius="0dp" 
                android:bottomRightRadius="5dp"/>
        </shape>
    </item>
    <item android:state_checked="false">
        <shape>
            <solid android:color="@color/myblue"/>
            <corners 
                android:bottomLeftRadius="0dp" 
                android:topLeftRadius="5dp" 
                android:topRightRadius="0dp" 
                android:bottomRightRadius="5dp"/>
        </shape>
    </item>
</selector>
person Caspar Harmer    schedule 09.08.2011
comment
Я вижу, что могу заставить его работать, если исходный макет указывает на селектор с возможностью рисования, который выбирает между двумя разными XML-файлами формы (отмеченный и неотмеченный с определенными цветами вместо ColorStateList). Это то, что вы имеете в виду? Я сбит с толку, потому что это решение приводит к еще одному XML-файлу, а не к меньшему. Кроме того, это кажется немного более неуклюжим, чем то, что я пытался реализовать, поскольку два XML-файла формы теперь дублируют настройки углового радиуса, и изменения должны управляться в обоих местах. В любом случае это работает, так что спасибо! - person Scott; 11.08.2011
comment
Хм, я думаю, вам понадобится как минимум два файла xml (ваши левый и правый чертежи - при условии, что они разные). Я вижу, что это немного больно - дважды определять радиусную часть чертежа, но, к сожалению, я не вижу способа обойти это. - person Caspar Harmer; 11.08.2011