Drawable селектор не работает в желе Bean
У меня есть переносимый селектор в качестве фона для каждого элемента в ListView
, чтобы выделить выбранную строку. Eveything отлично работает в Ice Cream Sandwich, но, похоже, не работает в желе Bean. Невозможно найти документацию о том, какие изменения могут привести к ее прекращению работы и что мне нужно сделать, чтобы исправить ее.
Не работая, я имею в виду, когда я нажимаю на строку в ListView
, цвет фона элемента не поворачивает цвет @color/blue
, но он делает это в ICS.
Это код селектора, который я использую (listing_selector.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_focused="true" android:drawable="@color/blue" />
<item android:state_pressed="true" android:drawable="@color/blue" />
<item android:state_activated="true" android:drawable="@color/blue_selected" />
<item android:state_selected="true" android:drawable="@color/blue_selected" />
<item android:drawable="@android:color/transparent" />
</selector>
Это макет элемента ListView
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@color/listing_selector"
>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
/>
</RelativeLayout>
Этот ресурс синего цвета:
<resources>
<color name="blue">#ff33b5e5</color>
</resources>
ОБНОВЛЕНИЕ 1:
Попробовал переместить селектор из папки color
в папку drawable
и обновил код до этого:
android:background="@drawable/listing_selector"
ОБНОВЛЕНИЕ 2:
Также, на ListView
, попробовал добавить это:
<ListView android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:listSelector="@drawable/listing_selector"
/>
ОБНОВЛЕНИЕ 3:
Я думал, что это может быть что-то в моем коде, но я удалил весь код из onListItemClick
ListView
, и все еще selector
не работает.
ОБНОВЛЕНИЕ 4:
Я сузил его до state_selected
или state_activated
, не работая как, state_pressed
, кажется, работает
ОБНОВЛЕНИЕ 5:
Думаю, я ошибся. Я не думаю, что селектор узнается вообще. Я запутал встроенную подсветку ListView
в качестве моего селектора. Теперь я задаюсь вопросом, связано ли это с тем, как мой проект настроен. У меня есть селектор в классе библиотеки. Возможно, что-то изменилось с ICS на JB, однако перемещение селектора в проект моего приложения, похоже, не исправило его.
ОБНОВЛЕНИЕ 6:
Хорошо, после некоторого увеличения волос я снова сузил его до того, как state_selected
или state_activated
не распознается, так как изменение цвета для state_pressed
действительно работает, а это значит, что мой селектор распознан. Из комментариев, похоже, что-то с моим приложением, так как другие смогли получить селекторов, работающих с желе Bean.
Хотя интереснее всего то, что изменение значения drawable
для состояния по умолчанию не распознается. Где у меня color/transparent
, я бы подумал, что изменение этого цвета приведет к тому, что листинг изменится на этот цвет, но это не так.
Кроме того, это также не работает в ICS.
ОБНОВЛЕНИЕ 7:
После еще большего натяжения волос я обнаружил, что длительное нажатие на элемент меню приводит к изменению цвета этого элемента. Просто нажатие на элемент все еще не работает. Даже не уверен, что означает.
** Окончательное обновление: **
Я сдаюсь, я удалил селектор и просто обновляю ListView
при щелчке и запоминаю позицию, щелкнув и выделив ее из кода. Не идеально, но не стоит пытаться исправить.
Ответы
Ответ 1
Хорошо, я думаю, что это проблема с вашим селектором. Попробуйте удалить state_focused и state_activated. Вы можете попробовать это для своего селектора:
<!-- Disabled State -->
<item
android:state_enabled = "false"
android:state_focused = "true"
android:state_pressed = "true"
android:drawable="@android:color/transparent">
</item>
<item
android:state_enabled = "false"
android:state_focused = "true"
android:drawable="@android:color/transparent">
</item>
<!-- Pressed State -->
<item
android:state_pressed = "true"
android:state_focused = "true">
<shape>
<solid android:color="@color/blue"/>
</shape>
</item>
<item
android:state_pressed = "true"
android:state_focused = "false">
<shape>
<solid android:color="@color/blue"/>
</shape>
</item>
<!-- Normal State -->
<item
android:drawable="@android:color/transparent">
</item>
Я обнаружил, что мне нужно использовать объект фигуры, а не android:drawable
, потому что на телефонах до ICS весь список будет выделен цветом вместо имени нажатого списка.
Вы также можете добавить код state_selected
, но я не уверен, как он будет использоваться. Проверьте код выбора по умолчанию для jelly bean для состояний, которые они используют: list_selector_background.xml.
Ответ 2
listing_selector.xml
должен находиться в папке res/drawable
и установить атрибут android:background
вашего RelativeLayout следующим образом:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@drawable/listing_selector"
>
Ответ 3
Я не могу сказать, почему он работает в одной версии и не работает в другом, но я получил альтернативное решение.
Определите свой цвет как ресурс в ресурсах
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="blue">#00F</drawable>
...
</resources>
Используйте этот цвет в своем селекторе
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/blue" />
...
...
</selector>
Попробуйте это и дайте мне знать.
Ответ 4
Я думаю, что он отлично работает!!
ваш код файла xml вашего селектора: -
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/gray" android:state_focused="true"/>
<item android:drawable="@color/gray" android:state_pressed="true"/>
<item android:drawable="@color/orange" android:state_activated="true"/>
<item android:drawable="@color/orange" android:state_selected="true"/>
<item android:drawable="@color/orange"/>
</selector>
теперь создайте значения папки-v16 под папкой res и поместите в него этот файл цветов.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="gray">#4f4f4f</color>
<color name="orange">#e26c0e</color>
</resources>
а затем список:
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="20dp"
android:listSelector="@drawable/listing_selector" >
</ListView>
Надеюсь, это сработает! Протестировано на версии 4.1
Ответ 5
Из Документов API:
Примечание. Помните, что Android применяет первый элемент в списке состояний который соответствует текущему состоянию объекта. Итак, если первый элемент в список не содержит ни одного из атрибутов состояния выше, то это применяется каждый раз, поэтому значение по умолчанию всегда должно быть последний (как показано в следующем примере).
Таким образом, попробуйте изменить порядок состояний ваших селекторов в соответствии с предлагаемым порядком. В вашем случае это будет следующим:
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@color/blue" />
<item android:state_focused="true" android:drawable="@color/blue" />
<item android:state_selected="true" android:drawable="@color/blue_selected" />
<item android:state_activated="true" android:drawable="@color/blue_selected" />
<item android:drawable="@android:color/transparent" />
</selector>