2015-05-16 2 views
4

У меня есть элемент selector в моем приложении, который используется в качестве цвета фона строки списка. Дело в том, что строка меняет цвет при нажатии/прикосновении.Тема для селектора, который можно использовать на pre-Lollipop

Поэтому селектор использует две протяжки, одну для прессованного состояния и одну регулярную. Файл: rowbgselector.xml в папке res/color:

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

Эти два вводимого коэффициента ссылочных определены в res/drawable в виде простых форм прямоугольник с цветом:

Файл rowbg_shape.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/row_bg"/> 
</shape> 

Файл rowbg_shape_selected.xml:

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

Это работает на Lollipop устройствах, но не на что-либо заранее леденец с ошибкой, которая не говорит много: Caused by: android.content.res.Resources$NotFoundException: File res/drawable/rowbg_shape_selected.xml from drawable resource ID #0x7f02006c

Я считаю, что вопрос заключается в том, что это ошибка, которая была исправлена ​​в леденец, смотрите здесь: https://code.google.com/p/android/issues/detail?id=26251

Проблема в том, что я пытаюсь ссылаться на attr/colorAccent, что, конечно, определено в моих темах. У меня есть несколько тем с разными цветами, которые пользователь может выбрать, и attr/colorAccent отличается во всех из них. Однако, похоже, из-за этой ошибки на pre-Lollipop вы не можете ссылаться на такой атрибут в селекторе ...

Каковы мои альтернативные варианты? Единственный вариант, о котором я могу думать, это создать отдельный XML-файл выбора для каждой темы и добавить что-то вроде attr/bg_selector, которое затем ссылается на правильный файл селектора для каждой темы. Это займет много времени, и в дальнейшем это будет тонкой работой, чтобы изменить что-либо для этого селектора (что, если я хочу сделать цвет немного темнее или светлее позже, мне придется пройти через все эти файлы ...).

Нет ли другого варианта?

+0

Я сделал что-то подобное здесь. вероятно, это может вам помочь: http://stackoverflow.com/questions/24717352/selector-layer-list-and-shape-bitmap-in-the-same-xml – gian1200

+0

Я не уверен, что это важно, все ваши цвета и т.д. являются статическими. Я хочу ссылаться на атрибут, чтобы изменить его значение в моей (многие) темы, но это невозможно в селекторе (по крайней мере, до Lollipop). –

+0

Почему вы используете '? Attr/colorAccent', вместо этого что-то вроде« @ color/... »? – gian1200

ответ

1

TL; Я боюсь, что вы правы, нет другого способа решить эту проблему до Lollipop.

Я наткнулся на этот вопрос в поисках ответа на родственный, но другой вопрос с одним из встроенных селекторов (а именно activatedBackgroundIndicator, как он относится к colorControlActivated и colorAccent). В моем случае хакерским решением было определение цветового ресурса в общей библиотеке, а затем определение цветового ресурса с одним и тем же именем в каждом приложении. Я не думаю, что есть что-то подобное для тем, которые поддерживаются pre-Lollipop.