在Lollipop之前设计一个可选择的选择器

时间:2015-05-16 17:33:23

标签: android android-theme attr android-selector

我的应用中有一个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之类的内容,然后为每个主题引用正确的选择器文件。这将花费我很多时间,并且进一步改变这个选择器的任何东西将是大量工作(如果我想稍后使颜色变得更暗或更轻,我将不得不浏览所有这些文件......)。

没有其他选择吗?

1 个答案:

答案 0 :(得分:1)

TL; DR:我担心你是对的,没有其他办法解决这个问题前Lollipop。

我遇到了这个问题,其中一个内置选择器(即与activatedBackgroundIndicatorcolorControlActivated相关的colorAccent)搜索相关但不同的问题的答案。在我的例子中,一个hacky解决方法是在共享库中定义颜色资源,然后在每个应用程序中定义相同名称的颜色资源。我不认为在Lollipop之前支持的主题有类似的东西。