ListSelector применяется ко всему списку

У меня есть простой список с таким списком 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" 

У меня такая же проблема. У меня есть собственное фоновое изображение, и я не хочу делать варианты этого фонового изображения, потому что было бы утомительно представлять все разные состояния.

Поэтому я хочу сделать очевидную вещь, иметь полупрозрачную панель, наложенную поверх сфокусированного списка, и когда пользователь нажимает клавишу «войти» или что-то в этом роде, он мигает до наложенного цвета наложения, который является более ярким и несколько Более непрозрачный.

Решение заключалось в том, чтобы держаться подальше от любого @color или @drawable, который относится к цвету внутри listSelector. Я создал два файла размером 3×3 пикселя .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. Получение выделения и последующего нажатия цветов точно, как они должны быть.

У меня была такая же проблема, и, глядя на один из платформ 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

Если вы настраиваете макет строки для каждого элемента в списке, так я это делаю. Обратите внимание на прозрачное значение, установленное в списке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> 

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> 

Надеюсь это поможет

Селектор списка – 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> 

Вы не всегда должны создавать изображение, вы можете определить форму

 <?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>