Селектор на цвет фона TextView

Я пытаюсь изменить цвет фона виджета 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", во время выполнения я получаю следующее исключение:

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

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

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

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

Каков правильный способ применения фонового цвета-селектора к TextView в Android?

Ответ 1

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

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

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

Ответ 2

Решение 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>

Ответ 3

Еще более простое решение выше:

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

Сохраните это в выпадающей папке, и вам будет хорошо.

Ответ 4

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

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

Ответ 5

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

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

Также для его выбора используйте:

android:textIsSelectable="true"