我的应用中有一个selector
项目,用作listview行的背景颜色。关键是当行被点击/触摸时,行会改变颜色。
选择器因此使用两个drawable,一个用于按下状态,一个用于常规。
文件夹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>
引用的两个drawable在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设备,但在Lollipop之前的任何内容都失败,并且错误说不多:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/rowbg_shape_selected.xml from drawable resource ID #0x7f02006c
我认为问题在于这是一个在Lollipop中修复的错误,请参见此处:https://code.google.com/p/android/issues/detail?id=26251
问题是我正在尝试引用attr/colorAccent
,这当然是在我的主题中定义的。我有几个不同颜色的主题,用户可以选择,attr/colorAccent
在所有主题中都有所不同。然而,似乎由于前Lollipop上的这个错误,你无法在选择器中引用这样的属性......
我的替代选择是什么?我能想到的唯一选择是为每个主题创建一个单独的选择器xml文件,并添加attr/bg_selector
之类的内容,然后为每个主题引用正确的选择器文件。这将花费我很多时间,并且进一步改变这个选择器的任何东西将是大量工作(如果我想稍后使颜色变得更暗或更轻,我将不得不浏览所有这些文件......)。
没有其他选择吗?
答案 0 :(得分:1)
我遇到了这个问题,其中一个内置选择器(即与activatedBackgroundIndicator
和colorControlActivated
相关的colorAccent
)搜索相关但不同的问题的答案。在我的例子中,一个hacky解决方法是在共享库中定义颜色资源,然后在每个应用程序中定义相同名称的颜色资源。我不认为在Lollipop之前支持的主题有类似的东西。