Селектор на колір тла TextView


121

Я намагаюся змінити колір тла TextViewвіджета Android, коли користувач торкнеться його. Для цього я створив селектор, який зберігається в 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: тег вимагає атрибута 'dravable' або дочірнього тега, що визначає виводимий файл

Коли я змінюю атрибут на Dravable, він працює, але результат виглядає абсолютно неправильно, оскільки ідентифікатори, мабуть, інтерпретуються як посилання на зображення замість кольорових посилань (як підказує "малюється").

Що мене бентежить, це те, що я можу встановити кольорову посилання, наприклад, "@ color / black" як атрибут фону. Це працює як очікувалося. Використання селекторів не працює.

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

Який правильний спосіб застосувати селектор кольорів фону до системи TextViewAndroid?


Колір можна трактувати як малювальний. Як результат є неправильним?
Ромен Гай

Він не відображає колір, а зображення з моїх ресурсів, як фон.
digitalbreed

2
Вищезазначене має спрацювати, якщо ви використовуєте android: dravable, не android: color - принаймні, у цьому випадку він працює для мене: android: dravable = "@ color / my_custom_color". Мої кольори визначені у значеннях / кольорах.xml
AgentKnopf

Відповіді:


226

Проблема тут полягає в тому , що ви не можете визначити колір фону , використовуючи селектор кольору, вам потрібен 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щоб він закінчився зіткненням ідентифікатора, вибравши неправильний ресурс.

Сподіваюсь, це все ще може допомогти комусь, навіть якщо ОП, мабуть, вже вирішило його проблему.


1
Спасибі, Бенуа. Проблема була вирішена (мушу визнати, я не пам'ятаю, як саме я це зробив у підсумку) і проект був успішно закінчений. Я вдячний, що ти повернувся сюди, щоб опублікувати та допомогти людям, що потрапили в цю проблему в майбутньому, великий дух!
digitalbreed

Я не можу зробити цю роботу. Я намагаюся застосувати його до кнопки, і вона встановлює фон за кольором селектора за замовчуванням, але він не змінюється у формі, визначеній у state_pression. Що я міг бракувати? Я можу відкрити нове запитання, на всякий випадок, якщо ви можете направити мене в правильному напрямку.
Мараги

@Maragues важко сказати, не побачивши жодного коду. Я рекомендую вам відкрити нове запитання та опублікувати відповідний код, щоб ми могли з'ясувати, що може бути не так. Ви можете додати коментар до цієї публікації, також посилаючись на ваше нове повідомлення.
Бенуа Мартін

9
Чому б просто не використати "dravable =" @ color / your_color "безпосередньо в селекторних елементах? Вам не потрібно визначати будь-які фігури або будь-які інші файли, просто визначте їх кольором у значеннях / color.xml (це завжди добре не для жорстких кольорів).
javaxian

Не працює. Він показує мені інший колір, ніж обидва, які я оголосив у формі xml.
Er.Rohit Sharma

121

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

Чомусь у вашому рішенні не відображається колір, а випадкове зображення з моєї папки "Drawable ресурси". Я намагався очистити проект / виправити властивості / зберегти / знову відкрити затемнення, як це здається насправді дивним, але безрезультатно. Дивно.
Яхель

@Yahel Ви, можливо, назвали ресурс для малювання кольором таким же, як і фактичний файл, що малюється?
Йона

@Jona: Ні, але малювальне назвали background_application, а колір, який можна назвати, отримав назву background_white_transparent. У обох були передумови в них ... Я бачу, що на якомусь іншому потоці те ж саме відбувається і з іншими, тому я подав це як один із численних помилок Android і переробив весь мій макет, щоб обійти його.
Яхель

@Yahel Mmm ... Ну, я бачу цю проблему, але в моєму випадку не однакові імена файлів ... Ознайомтеся з моїми питаннями тут stackoverflow.com/questions/9004744/…
Jona

не вдалося змусити його працювати, відповідь від Бенуа Мартіна спрацював чудово.
Еммануель Тузері

83

Ще простіше рішення вищезазначеного:

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

Збережіть це у папці, що витягується, і ви готові йти.


1
Можливо, це працює, але офіційно це не підтримується (Android Studio трактує це як помилку).
Blackhex

@Blackhex Strange. Для мене добре працює у Eclipse. Ймовірно, це помилка Lint, і якщо вона є, ви повинні мати можливість відключити або проігнорувати її.
Джейсон Робінсон

6
Це те, що я вважав би рішенням.
Покладіть Гонсалес

<item android:state_pressed="true" android:color="@color/vantablack"/>виглядає семантично однаково<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
Саміс

16

Навіть це працює.

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

кольоровий атрибут працює, коли ви встановлюєте кольори перегляду тексту, але не з фоном, оскільки фактично кольори на фоновому режимі виступають як ColorDravable
Akhil Dad

Найкраще і найпростіше рішення для втілення в життя всього вище.
4gus71n

6

Для того, хто шукає це зробити, не створюючи фоновий сектор, просто додайте ці рядки до TextView

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

Також, щоб зробити його вибірним:

android:textIsSelectable="true"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.