суббота, марта 16, 2013

android:listSelector

Столкнулся с тем, что селектор для ListView, заданный при помощи android:listSelector, обрабатывается по-разному в android 2.2 и в 4.x

Селектор был объявлен так:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/green_background_light" android:state_selected="true"/>
    <item android:drawable="@color/green_background_light" android:state_pressed="true"/>
    <item android:drawable="@color/background_default"/>
</selector>

Есть стиль:

    <style name="ListView" parent="@android:style/Widget.ListView">
        <item name="android:cacheColorHint">#00000000</item>
        <item name="android:listSelector">@drawable/background_selector_normal</item>
        ...   ...    ...
    </style>


Этот стиль уже применяется к ListView.
При запуске на устройствах с андроидом 4.х элементы списка ведут себя ожидаемым образом - при нажатии и до отпускания элементы меняют цвет фона на заданный в селекторе.
При запуске на 2.2 увидел, что цвет фона меняется для всего listView целиком - более того, после отпускания элемента сам список так и остаётся гламурно-зеленоватым, а элемент, для которого было выполнено нажатие, меняет цвет фона на заданный по-умолчанию.

Чтобы достичь желаемого поведение и на старых устройствах, нужно в селекторе вместо объявления цвета использовать "честные" drawable:


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/green_background_light" />
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/green_background_light" />
        </shape>    
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/background_default" />
        </shape>      
    </item>
</selector>