【问题标题】:Themeing a selector drawable on pre-Lollipop在棒棒糖之前为可绘制的选择器设置主题
【发布时间】: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


【解决方案1】:

TL;DR:恐怕你是对的,在 Lollipop 之前没有其他方法可以解决这个问题。

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

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2016-03-17
    • 2023-03-21
    • 2016-03-23
    相关资源
    最近更新 更多