Селектор на цвет фона TextView - PullRequest
119 голосов
/ 29 августа 2010

Я пытаюсь изменить цвет фона виджета Android TextView, когда пользователь касается его. Для этого я создал селектор, который хранится в res/color/selector.xml и выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:color="@color/semitransparent_white"
        />
    <item
        android:color="@color/transparent"
        />
</selector>

Атрибут clickable TextView равен true, на случай, если это будет интересно.

Когда я назначаю этот селектор для TextView как android:background="@color/selector", я получаю следующее исключение во время выполнения:

ОШИБКА / AndroidRuntime (13130): вызвано: org.xmlpull.v1.XmlPullParserException: строка двоичного XML-файла # 6: для тега требуется атрибут drawable или дочерний тег, определяющий drawable

Когда я изменяю атрибут на drawable, он работает, но результат выглядит совершенно неверным, потому что идентификаторы, по-видимому, интерпретируются как ссылки на изображения вместо ссылок на цвета (как предполагает «drawable»).

Что меня смущает, так это то, что я могу установить эталон цвета, например, "@ color / black", как атрибут фона напрямую. Это работает, как ожидалось. Использование селекторов не работает.

Я также могу использовать селектор в качестве textColor без проблем.

Как правильно применить переключатель цвета фона к TextView в Android?

Ответы [ 5 ]

214 голосов
/ 14 марта 2011

Проблема в том, что вы не можете определить цвет фона, используя селектор цвета, вам нужен селектор 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/selected_state" />
</selector>

Вам также необходимо переместить этот ресурс в каталог drawable, где это будет иметь больше смысла, так как это не селектор цвета как таковой.

Тогда вам нужно будет создать файл res/drawable/selected_state.xml следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <solid android:color="@color/semitransparent_white" />
</shape>

и, наконец, вы будете использовать его следующим образом:

android:background="@drawable/selector"

Примечание: причина, по которой ОП получал нарисованный ресурс изображения, возможно, в том, что он пытался сослаться на свой ресурс, который все еще находился в каталоге цветов, но использовал @drawable, поэтому он столкнулся с ID, выбрав неправильный ресурс.

Надеюсь, это все еще может кому-то помочь, даже если ОП, я надеюсь, уже решил его проблему.

111 голосов
/ 01 ноября 2011

Решение Benoit работает, но вам действительно не нужно брать на себя накладные расходы, чтобы нарисовать форму.Поскольку цвета можно рисовать, просто определите цвет в файле /res/values/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="semitransparent_white">#77ffffff</color>
</resources>

, а затем используйте его в качестве селектора:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@color/semitransparent_white" />
</selector>
80 голосов
/ 06 февраля 2012

Еще более простое решение для вышеупомянутого:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="@color/semitransparent_white" />
    </item>
    <item>
        <color android:color="@color/transparent" />
    </item>
</selector>

Сохраните это в папке для рисования, и все готово.

16 голосов
/ 03 января 2014

Даже это работает.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:drawable="@android:color/white" />
</selector>

Я добавил атрибут android:drawable к каждому элементу, а их значения - цвета.

Кстати, почему они говорят, что color это один из атрибутов selector?Они не пишут, что требуется android:drawable.

Ресурс списка состояний цвета

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>
4 голосов
/ 17 марта 2017

Для тех, кто ищет это, не создавая фоновый сектор, просто добавьте эти строки в TextView

android:background="?android:attr/selectableItemBackground"
android:clickable="true"

Кроме того, чтобы использовать его по выбору:

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