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

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 при щелчке и запоминаю позицию, щелкнув и выделив ее из кода. Не идеально, но не стоит пытаться исправить.

4b9b3361

Ответ 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>