【发布时间】:2015-05-16 17:33:23
【问题描述】:
我的应用中有一个selector 项目,用作列表视图行的背景颜色。关键是该行在单击/触摸时会改变颜色。
因此选择器使用两个可绘制对象,一个用于按下状态,一个用于常规。
文件: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 设备,但在任何预 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 在所有主题中都不同。然而,似乎由于棒棒糖前的这个错误,你不能在选择器中引用这样的属性......
我有哪些替代选择?我能想到的唯一选择是为每个主题创建一个单独的选择器 xml 文件,并添加类似 attr/bg_selector 的内容,然后为每个主题引用正确的选择器文件。这将花费我很长时间,而且要更改此选择器的任何内容将是大量的工作(如果我想稍后使颜色稍微变暗或变浅,我必须浏览所有这些文件......)。
没有其他选择吗?
【问题讨论】:
-
我在这里做了类似的事情。也许这可以帮助你:stackoverflow.com/questions/24717352/…
-
我不确定这是否相关,你所有的颜色等都是静态的。我想引用一个属性,以便我可以在我的(许多)主题中更改它的值,但这在选择器中是不可能的(至少在 Lollipop 之前)。
-
为什么你使用
?attr/colorAccent,而不是类似´@color/...´? -
因为这允许我为每个主题指定不同的颜色。如果我使用 @color/... 我必须硬编码颜色并且不能在主题之间更改它。请注意,我将
@color/row_bg用于非按下状态,因为所有主题对非按下状态使用相同的颜色(row_bg,即白色),但对于按下状态,我希望颜色取决于主题。 -
您找到解决方法了吗?似乎
?attr/colorAccent在中仍然不起作用
标签: android android-theme attr android-selector