ListSelector применяется ко всему списку - PullRequest
47 голосов
/ 02 февраля 2010

У меня есть простой список с подобранным списком.

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

Ответы [ 6 ]

89 голосов
/ 01 марта 2011

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

Например, вместо:

<item android:state_focused="true"
      android:drawable="@drawable/list_active" />

Do:

<item android:state_focused="true">
    <shape>
        <solid android:color="#66000000" />
    </shape>
</item>

Помимо простого рисования простым цветом, форма является гибкой, похожей на простой векторный объект. Все подробности можно найти здесь: http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

28 голосов
/ 28 апреля 2010

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

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

Решение состояло в том, чтобы держаться подальше от любого @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"

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

17 голосов
/ 28 сентября 2011

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

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>

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

2 голосов
/ 02 февраля 2010

Селектор списка: StateListDrawable & mdash; он содержит ссылку на несколько элементов рисования для каждого состояния, в котором список может быть, например, выбран, сфокусирован, нажат, отключен ...

В вашем случае, установив один цвет, список рисует # 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>
1 голос
/ 19 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...