ListSelector применяется ко всему списку
У меня есть простой список с подобным списком.
<ListView android:id="@+id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_below="@+id/round"
android:listSelector="#99000000" android:clickable="true" android:cacheColorHint="#00000000" android:background="#00000000">
</ListView>
Как вы можете видеть андроид: listSelector = "# 99000000", но цвет "черный альфа" применяется ко всему списку, а не к выбранному элементу.
Итак, это то, что у меня есть сейчас, но весь список по-прежнему становится черным
:: listview_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:state_focused="true"
android:drawable="@drawable/list_normal" />
<item android:state_pressed="true"
android:drawable="@drawable/list_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/list_active" />
</selector>
:: colors.xml
<resources>
<drawable name="list_normal">#96FFFFFF</drawable>
<drawable name="list_active">#66000000</drawable>
<drawable name="list_pressed">#CA000000</drawable>
</resources>
:: тег xml в моем списке
android:listSelector="@drawable/listview_background"
Ответы
Ответ 1
У меня была та же проблема. У меня есть собственное фоновое изображение, и я не хочу делать варианты этого фонового изображения, потому что было бы утомительно представлять все разные состояния.
Итак, я хочу сделать очевидную вещь, иметь полупрозрачную панель, наложенную поверх сфокусированного списка, и когда пользователь нажимает клавишу "enter" или что-то еще, он мигает до наложенного цвета наложения, что больше поразительный и несколько более непрозрачный.
Решение заключалось в том, чтобы держаться подальше от любого @color или @drawable, который относится к цвету внутри listSelector. Я создал два файла размером 3x3 пикселя .png. Каждый из них сохраняется с гамма-слоем. В моем случае два одинаковых цвета смешиваются в Gimp с другой прозрачностью на цветовом слое. Поэтому, когда вы выбираете элемент, вы получаете наложение с 25% цветом, а когда вы его нажимаете, вы получаете png с 50% цветом. Я помещал их в свои чертежи как bg_list_item_pressed.png и bg_list_item_highlighted.png
Затем я установил свой селектор списка:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selected -->
<item
android:state_focused="true"
android:state_pressed="false"
android:drawable="@drawable/bg_list_item_highlighted" /> <!-- @drawable/tab_focus -->
<!-- Pressed -->
<item
android:state_pressed="true"
android:drawable="@drawable/bg_list_item_pressed" /> <!-- @drawable/tab_press -->
</selector>
Затем я добавил свои атрибуты listSelector в свой ListView в моем макете xml:
android:listSelector="@drawable/list_selector"
android:drawSelectorOnTop="true"
Теперь он работает именно так, как я хочу, чтобы он работал. Включая использование D-pad для выбора строки и нажмите ее с enter. Получение выделения и последующего нажатия цветов точно, как они должны быть.
Ответ 2
У меня была такая же проблема, и, глядя на один из платформ XML файлов, я заметил способ устранить необходимость создания файла изображения только для цвета, создав форму в XML.
Например, вместо:
<item android:state_focused="true"
android:drawable="@drawable/list_active" />
делать:
<item android:state_focused="true">
<shape>
<solid android:color="#66000000" />
</shape>
</item>
Помимо простого создания простого цвета, форма является гибкой, похожей на простой векторный объект. Все подробности можно найти здесь: http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape
Ответ 3
Если вы настраиваете макет строки для каждого элемента в списке, так я это делаю. Обратите внимание на прозрачное значение, заданное в спискеSelector. (Для краткости я удалил colors.xml.)
main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="#00000000"/>
</LinearLayout>
row.xml
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@drawable/list_selector">
...
</FrameLayout>
list_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="#66FFFFFF" />
<item android:drawable="#FF666666"/>
</selector>
Ответ 4
Селектор списков StateListDrawable
— он содержит ссылку на несколько чертежей для каждого состояния, которое может быть, например, выбранным, сфокусированным, нажатым, отключенным...
В вашем случае, установив один цвет, в списке отображается # 9000 для каждого отдельного состояния.
Вам нужно определить StateListDrawable
, как описано выше, с XML, похожим на следующее. Это то, что вы установили в свой атрибут android:listSelector
.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:state_focused="true"
android:drawable="@drawable/item_disabled" />
<item android:state_pressed="true"
android:drawable="@drawable/item_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/item_focused" />
</selector>
Или, чтобы установить один и тот же селектор списка для всех списков в приложении, вы можете переопределить селектор в теме Widget.ListView
:
<style name="Widget.ListView" parent="Widget.AbsListView">
<item name="android:listSelector">@drawable/my_custom_selector</item>
</style>
Ответ 5
Jax,
Я пытался выяснить, почему весь мой список меняет цвет, устанавливая listSelector, и выяснил, что это именно то, что он должен делать, т.е. мы устанавливаем цвет для всего списка, а не строку, которая это то, что мы хотим.
Вот что вы хотите сделать:
Я предполагаю, что у вас есть ListView, определенный в XML. И для этого ListView я предполагаю, что вы используете какой-либо адаптер для установки данных. Также для этого адаптера вы используете некоторый вид строки, который определен в XML. Вы хотите установить фон этого элемента строки следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@drawable/textview_selector">
<TextView android:id="@+id/textForList"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:padding="10sp" />
</LinearLayout>
Вот мой textview_selector.xml, который хранится в drawable:
<?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/teal" />
<item android:drawable="@drawable/white" />
</selector>
Надеюсь, что это поможет
Ответ 6
Вам не всегда нужно создавать изображение, вы можете определить форму
<?xml version="1.0" encoding="utf-8"?>
<item android:state_focused="true" android:state_pressed="false">
<shape android:shape="rectangle">
<solid android:color="#40000000"/>
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#80000000"/>
</shape>
</item>