Столкнулся с тем, что селектор для 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>
Селектор был объявлен так:
<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>
Комментариев нет:
Отправить комментарий