Программно изменить цвет фона TextView при нажатии

#android #android-layout

#Android #android-макет

Вопрос:

У меня есть несколько TextViews, которые динамически добавляются в LinearLayout. Эти текстовые просмотры доступны для просмотра и имеют OnLongClickListener (я также намерен добавить OnClickListener позже)

Вот в чем дело, я хочу, чтобы эти TextView меняли цвет фона при нажатии, и я читал, что для этого можно использовать селекторы.

Итак, я создал этот xml-файл в res/drawable/text_view_pressed.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="#000000"/>
    <item android:state_pressed="false"
        android:color="#FFFFFF"/>
</selector>
  

Я попытался создать TextView и с помощью этого xml-файла мне нравится это:

 TextView t = new TextView(this);
t.setBackgroundColor(R.drawable.text_view_pressed);
  

Но когда я это сделаю, это выдаст эту ошибку в t.setBackgroundColor: «Следует передать разрешенный цвет вместо идентификатора ресурса здесь: getResources().getColor(R.color.text_view_pressed)» но это не сработает должным образом, если я использую getResources().getColor(R.color.text_view_pressed).

У кого-нибудь есть идея, как это сделать?

Ответ №1:

Вы на правильном пути. Однако есть важная деталь.

Есть два типа ресурсов, на которые могут влиять состояния: ColorStateList и StateListDrawable .

Список состояния цвета может использоваться только в определенных контекстах, например в TextView.setTextColor() . Насколько я вижу, вы не можете использовать список состояния цвета в качестве параметра setBackgroundColor() , если вы хотите изменить фон представления при его нажатии. Для этого вам нужен список состояний, который можно нарисовать. А в списке состояний, который можно нарисовать, android:drawable атрибут является обязательным.

Итак, подводя итог:

  • XML-файл должен быть помещен в resdrawable ,
  • Его структура должна немного отличаться (т. Е. список состояний, а не список цветов), и
  • Вам нужно использовать setBackgroundResource() вместо setBackgroundColor() .

Пример файла:

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

Если вы хотите использовать пользовательские цвета вместо белого и черного, вам просто нужно определить их как ресурсы в resvalues и ссылаться на них отсюда.

Комментарии:

1. Спасибо за совет. Я сделал то, что вы сказали, но приложение просто останавливается с фатальным завершением. 07-06 23:18: 21.330: E / AndroidRuntime(4480): java.lang.RuntimeException: Не удается запустить activity ComponentInfo{br.rodrigo.davy.vazdividiraconta/br.rodrigo.davy.vazdividiraconta. MainActivity}: android.content.res.Resources$NotFoundException: Файл res/drawable/text_view_pressed.xml из идентификатора ресурса для рисования #0x7f020058

2. @Rodrigo да, следствием является то, что файл должен находиться в res drawable. Извините, что не упомянул об этом

3. Спасибо за вашу добрую волю! Я уже изменил папку на res drawable, когда вы упомянули, что «Селектор — это StateListDrawable, тип drawable» раньше. Тем не менее, это все еще выдает мне ту же ошибку.

4. @Rodrigo Да? Странно. Вы пробовали обновлять и очищать проект?

5. Просто попытался обновить и очистить. Я даже пытался запустить приложение как на своем телефоне, так и на планшете. Результаты всегда одни и те же…