Android主题drawable与颜色drawable不兼容(Bug?)

3

我正在尝试制作一个选择器,它使用基于主题的颜色作为其背景。根据这个SO答案的说明,我首先在res/values/colors.xml中定义我的颜色可绘制对象:

<color name="selected">#FFF7C9</color>

然后我在res/values/attrs.xml中定义了一个属性:

<attr name="drawable_selected" format="reference" />

然后在我的主题中,我将属性设置为我的颜色可绘制资源(res/values/styles.xml):

<style name="AppThemeWhite" parent="AppTheme">
    <item name="drawable_selected">@color/selected</item>
</style>

最后,我在我的选择器中引用了属性(res/drawable/selected_background):

<selector>
    <item android:state_activated="true" android:drawable="?drawable_selected" />
    <item android:drawable="@android:color/transparent" />
</selector>

当我运行这个程序时,当尝试膨胀使用选择器的类时,我会得到一个错误Binary XML file line #2: Error inflating class <unknown>。但是,当我将选择器的state_activated更改为直接使用android:drawable="@color/selected"引用可绘制对象时,它可以工作。
这是一个错误吗?还是我做错了什么?
编辑
如果我添加一个颜色属性(res/values/attrs.xml)
<attr name="selected_color" format="color" />

并在我的主题中定义颜色(res / values / styles.xml)

<item name="selected_color">#FFF7C9</item>

我可以通过更改颜色资源(res/values/colors.xml)来更改可绘制对象的颜色。
<color name="selected">?selected_color</color>

我希望通过在选择器中直接使用android:drawable="@color/selected"引用可绘制对象。但是这样会导致崩溃!将颜色可绘制对象改回硬编码的值#FFF7C9可以解决问题。看来整个主题系统都有些问题...

1个回答

2

原因

目前在Android上,从drawable(或颜色)引用自定义主题属性是不起作用的。

您可以在此处查看有关长时间报告的问题的更多详细信息:https://code.google.com/p/android/issues/detail?id=26251

正如您所见,他们最终在Android L版本中解决了这个问题,但在低于L的任何地方引用将失败。

解决方案

为了解决这个问题,您需要做以下操作:

<selector>
    <item android:state_activated="true" android:drawable="@color/selected" />
    <item android:drawable="@android:color/transparent" />
</selector>

其中@color/selected在您的帖子开头处定义:

<color name="selected">#FFF7C9</color>

我在L预览版中尝试过这个...也许只有在正式发布时才能实现? - woojoo666
我现在无法自行测试,所以我只能看到他们问题跟踪器上的内容。但是无论是否修复,都没有关系 - 你可能不想依赖它(除非你想将应用程序针对L进行定位)。请使用解决方法。 - Maciej Ciemięga
是的,我已经使用了这个解决方法,我只是想问看看是否有其他人也遇到了同样的问题,是否应该要求重新开启问题报告。谢谢大家的帮助! - woojoo666
@woojoo666 如果您想重新打开该问题,您应该在第二个评论中提供的项目上使用L-preview进行测试。我提出了解决方案,因为您没有提到您已经使用此解决方法。顺便问一下,您正在寻找这个问题的答案吗?我已经确认过,这是一个已知的问题,并提供了Android错误跟踪器中相关的问题和可行的解决方法。如果我在任何时候误解了问题,请告诉我,以便我可以更新我的答案。 - Maciej Ciemięga
抱歉,我还在研究这个问题,我现在会将此标记为答案 lol。 - woojoo666
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接