#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. Просто попытался обновить и очистить. Я даже пытался запустить приложение как на своем телефоне, так и на планшете. Результаты всегда одни и те же…