Подтвердить что ты не робот

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

Ответ 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>