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>

Поскольку Вы видите android: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"
47
задан jax 3 February 2010 в 15:08
поделиться

2 ответа

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

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

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

Теперь он работает именно так, как Я хочу, чтобы это сработало. В том числе с помощью крестовины для выбора строки и щелчка по ней с вводом. Получение мелирования и последующего нажатия цветов именно такими, какими они должны быть.

28
ответ дан 26 November 2019 в 19:17
поделиться

Селектор списка - это 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>
2
ответ дан 26 November 2019 в 19:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: