TextView背景颜色的选择器


121

我试图TextView在用户触摸时更改Android 小部件的背景颜色。为此,我创建了一个选择器,该选择器存储在其中res/color/selector.xml,大致如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:color="@color/semitransparent_white"
        />
    <item
        android:color="@color/transparent"
        />
</selector>

clickable属性TextViewtrue,以备不时之需。

当我将此选择器分配给TextViewas时android:background="@color/selector",在运行时出现以下异常:

错误/ AndroidRuntime(13130):由以下原因引起:org.xmlpull.v1.XmlPullParserException:二进制XML文件第6行:标记需要“ drawable”属性或定义可绘制对象的子标记

当我将属性更改为drawable时,它可以工作,但是结果看起来是完全错误的,因为ID似乎被解释为图像参考,而不是颜色参考(如“ drawable”所示)。

令我感到困惑的是,我可以直接将颜色参考(例如“ @ color / black”)设置为background属性。这正在按预期方式工作。使用选择器不起作用。

我也可以将选择器用作textColor没有问题。

将背景颜色选择器应用于TextViewAndroid中的正确方法是什么?


颜色可以解释为可绘制的。结果到底是怎么错的?
罗曼·盖伊

它不是显示颜色,而是显示来自我的可绘制资源的图像作为背景。
digitalbreed 2010年

2
如果您使用的是android:drawable,而不是android:color,以上方法应该可以使用-至少在这种情况下,它对我有用:android:drawable =“ @ color / my_custom_color”。我的颜色在值/ colors.xml定义
AgentKnopf

Answers:


226

这里的问题是您不能使用颜色选择器定义背景颜色,需要一个可绘制的选择器。因此,必要的更改将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@drawable/selected_state" />
</selector>

您还需要将该资源移动到drawable更有意义的目录中,因为它本身不是颜色选择器。

然后,您将必须创建如下res/drawable/selected_state.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/semitransparent_white" />
</shape>

最后,您将像这样使用它:

android:background="@drawable/selector"

注意:OP获取绘制图像资源的原因可能是因为他试图仅引用仍然在color目录中但使用的资源,@drawable因此他最终遇到ID冲突,选择了错误的资源。

希望即使OP现在可能已经解决了他的问题,这仍然可以对某人有所帮助。


1
谢谢,贝努瓦。问题已解决(我必须承认,我不记得最终做得如何准确),并且该项目已成功完成。我很高兴您回到这里发表文章,并以极大的精神帮助将来遇到同样问题的人们!
digitalbreed 2011年

我不能做这个工作。我正在尝试将其应用于按钮,并且确实将背景设置为选择器的默认颜色,但它不会更改为state_pressed中定义的形状。我可能会缺少什么?我可能会提出一个新问题,以防万一您可以指出正确的方向。
Maragues 2011年

@Maragues,很难看到任何代码。我建议您打开一个新问题并发布相关代码,以便我们找出可能出问题的地方。您也可以在此信息中添加评论,并带有指向新信息的链接。
Benoit Martin

9
为什么不直接在选择器项中直接使用“ drawable =” @ color / your_color“呢?您无需定义任何形状或任何其他文件,只需在values / colors.xml中使用颜色定义即可(这总是很好的(不要对颜色进行硬编码)
。– javaxian

不工作 它显示的颜色与形状xml中声明的颜色不同。
罗希特·夏尔马

121

Benoit的解决方案有效,但是您确实不需要花费任何开销来绘制形状。由于颜色可以绘制,因此只需在/res/values/colors.xml文件中定义颜色即可:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="semitransparent_white">#77ffffff</color>
</resources>

然后在选择器中这样使用:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@color/semitransparent_white" />
</selector>

由于某种原因,您的解决方案不是显示颜色,而是显示我可绘制资源文件夹中的随机图像。我试图清理项目/修复属性/重新保存/重新打开日食,因为它看起来确实很奇怪,但无济于事。奇怪的。
Yahel 2012年

@Yahel您可能将颜色可绘制资源命名为与实际可绘制文件相同的名称?
乔纳

@Jona:不,但是可绘制对象被命名为background_application,而颜色可绘制对象被命名为background_white_transparent。两者都有背景...我在其他线程上看到了同样的情况,因此我将其作为众多Android错误之一提交,并修改了我的整个布局以解决该问题。
Yahel 2012年

@Yahel嗯......嗯,我看这个问题,但在我的情况不一样的文件名...结帐我的问题在这里stackoverflow.com/questions/9004744/...
乔纳

未能使其正常运行,Benoit Martin的回答很好。
Emmanuel Touzery 2012年

83

甚至更简单的解决方案:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="@color/semitransparent_white" />
    </item>
    <item>
        <color android:color="@color/transparent" />
    </item>
</selector>

将其保存在drawable文件夹中,就可以了。


1
也许这可行,但是正式不被支持(Android Studio将其视为错误)。
Blackhex 2013年

@Blackhex奇怪。在Eclipse中对我来说效果很好。可能是Lint错误,如果是,您应该可以禁用或忽略它。
杰森·罗宾逊

6
这就是我要考虑的解决方案。
莱·冈萨雷斯

<item android:state_pressed="true" android:color="@color/vantablack"/>在语义上看起来与<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis

16

即使这样也可以。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:drawable="@android:color/white" />
</selector>

我将android:drawable属性添加到每个项目,它们的值是颜色。

顺便说一句,为什么他们说那color是的属性之一selector?他们不写那android:drawable是必需的。

颜色状态列表资源

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

当您设置textview颜色但不使用背景时,color属性起作用,因为实际上背景上的颜色充当ColorDrawable
Akhil Dad

实施以上所有方法的最佳和最简单的解决方案。
4gus71n 2015年

6

对于谁正在寻找而不创建背景扇区的对象,只需将这些行添加到 TextView

android:background="?android:attr/selectableItemBackground"
android:clickable="true"

还使其可选使用:

android:textIsSelectable="true"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.