Android颜色选择器无法与自定义属性配合使用。

21

我在attrs.xml中有以下内容

<resources> 
    <!-- theme specific colors -->
    <attr format="reference|color" name="foreground" />
    <attr format="reference|color" name="background" /> 
</resources>

然后在theme.xml文件中进行如下操作

<style name="MyTheme" parent="android:Theme.Black">
    <item name="android:windowNoTitle">true</item>
    <item name="foreground">#0000FF</item>
    <item name="background">#00FF00</item>
</style>

我还创建了一个名为forground_to_background.xml的颜色选择器。

<selector xmlns:android="http://schemas.android.com/apk/res/android">   
    <item android:state_pressed="true" android:color="?background"/> <!-- pressed -->
    <item android:state_focused="true" android:color="?background"/> <!-- focused -->
    <item android:color="?foreground"/> <!-- default -->
</selector>

现在我想在TextView中将它们全部使用:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/forground_to_background" />

很不幸它没起作用。除了只有一种颜色-红色,我没有得到漂亮的绿蓝色。TextView始终是红色的。当我更改TextView使用"?foreground"颜色时,颜色会改变。另外,当我从"?xxxx"更改为硬编码值如"#00f"时,颜色开始工作。

问题出在哪里? 我做错了什么?

编辑: 我认为这是Can a selector resource use a color defined in a style?问题/错误的重复。

编辑2: 此外,当我尝试在ListView中使用此TextView时,应用程序会崩溃。它无法解析XML。


显然,此问题已在Android L预览版中得到修复,详见:https://code.google.com/p/android/issues/detail?id=26251 - Bianca Daniciuc
你找到你的问题的答案了吗?我也有同样的问题。 - Pavya
3个回答

16

在选择颜色时,您不能引用“?attr/”。如果您想在选择器中使用每个主题的颜色,可以创建多个选择器,这些选择器引用“@color/”和“@drawable/”,然后具有一个“引用”属性,将其中一个选择器与给定的样式相关联。

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

然后,您需要设置文本颜色:

android:textColor="?attr/forground_to_background"

我认为这段文本一直是红色的,因为Android将属性的整数值解释为颜色(红色),而不是将其用作查找实际所需内容的键。


8
这种情况发生的原因是我有不同的上下文。在填充布局时,上下文知道我的主题属性,但是对于我传递的ApplicationContext到ListView适配器,它并不知道这些属性。现在我不知道为什么它不知道这些属性 ;)

有关上下文的更多信息,请访问此处:http://www.doubleencore.com/2013/06/context/ 不同的上下文知道不同的事情... - Mikooos
这是一个愚蠢的错误,我一直在自责。我从未想过会因为如此简单的错误而犯错。你救了我的一天。 - Ashok Varma
遇到了同样的问题,一直在使用应用程序上下文,你救了我的一天! - GuilhE

0
你确定你是将MyTheme应用于activity还是textview吗? 另外一个你可以尝试的方法是,在你的forground_to_background.xml中,不要使用"?"操作符,而是尝试使用"@"。看看这是否能解决你的问题。

我确定我使用了 MyTheme :) 如果我使用“@”,项目将无法编译。 - Mikooos
我认为“foreground”可能不起作用。尝试使用“@color/foreground”。 - CChi

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