Цвет селектора Android ListView

Привет всем

У меня есть 2 вопроса относительно ListView в Android:

  1. Как я могу получить цвет выделенной строки списка? Я попытался использовать метод ListView.getSelector(), который, согласно его документации, должен дать мне то, что я ищу, но он дает мне объект Drawable, который я не знаю, как получить цвет от (если возможно...).

  2. Как я могу установить цвет выделенной строки списка? Здесь я попытался использовать метод setSelector() в списке, передав ему объект ColorDrawable, но в результате этого весь фон списка окрашен в этот цвет... а это не то что я хотел конечно...

Спасибо!


person WhiteTigerK    schedule 10.01.2010    source источник
comment
Это может помочь (есть как вопрос, так и решение): "> stackoverflow.com/questions/2065430/   -  person Uroš Milivojević    schedule 16.01.2010
comment
Кажется, в Android 2 есть ошибка, из-за которой цвет влияет на весь фон — проверьте мой ответ, который ссылается на обходной путь, указанный в другом вопросе.   -  person Richard Le Mesurier    schedule 08.04.2013


Ответы (2)


Рисуемый селектор списка представляет собой StateListDrawable, он содержит ссылку на несколько рисунков. для каждого состояния список может быть таким, как выбрано, сфокусировано, нажато, отключено...

Хотя вы можете получить рисуемое с помощью getSelector(), я не верю, что вы можете получить конкретный Drawable из StateListDrawable, и в любом случае не представляется возможным программно получить цвет непосредственно из ColorDrawable.

Что касается установки цвета, вам понадобится StateListDrawable, как описано выше. Вы можете установить это в своем списке, используя атрибут android:listSelector, определяя рисуемый объект в 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/item_disabled" />
  <item android:state_pressed="true"
        android:drawable="@drawable/item_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/item_focused" />
</selector>
person Christopher Orr    schedule 10.01.2010
comment
Я бы также переместил назначение селектора списка в пользовательскую тему, чтобы все списки в вашем приложении выглядели одинаково ‹item name=android:listSelector›@drawable/my_list_highlight‹/item› - person Alex Volovoy; 10.01.2010
comment
По крайней мере, это не работает с API 7/8. Кажется, что при нажатии весь фон меняется на тот же цвет, включая фон других строк, а также линии полей (у меня черные) между строками. - person Jonny; 21.01.2013
comment
@Jonny, у меня это работает при использовании рисунков, но не при использовании цветов. Добавили ответ, ссылающийся на хороший обходной путь, который работает для цветов. - person Richard Le Mesurier; 08.04.2013
comment
Здравствуйте, я пытаюсь использовать селектор в своем списке, как вы предложили, но у него есть 9 png, а не цвета. Также у меня есть собственный макет, который я раздуваю в своем списке, и использую селектор в качестве фона этого пользовательского макета. Можете ли вы предложить ? - person Prateek; 25.06.2013

ДОБАВИТЬ: @Christopher answer не работает с API 7/8 (согласно правильному комментарию @Jonny), ЕСЛИ вы используете цвета вместо рисунков. (В моем тестировании использование рисунков в соответствии с Кристофером отлично работает)

Вот ИСПРАВЛЕНИЕ для версии 2.3 и ниже при использовании цветов:

Согласно @Charles Harley, в версии 2.3 и ниже есть ошибка, из-за которой заполнение элемента списка цветом приводит к тому, что цвет растекается по всему списку. Его исправление состоит в том, чтобы определить shape drawable, содержащий нужный цвет, и использовать его вместо цвета.

Я предлагаю посмотреть эту ссылку, если вы хотите просто использовать цвет в качестве селектора и ориентироваться на Android 2 (или, по крайней мере, разрешить Android 2).

person Richard Le Mesurier    schedule 08.04.2013
comment
Это снова укусило меня только сейчас, спасибо, что напомнили мне, в чем настоящая проблема. - person Reuben Scratton; 09.04.2013