TextView背景颜色的选择器

时间:2010-08-28 22:40:41

标签: android

当用户触摸时,我正在尝试更改Android TextView小部件的背景颜色。我为此创建了一个选择器,它存储在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的{​​{1}}属性为 TextView

当我将此选择器作为true分配给TextView时,我在运行时收到以下异常:

  

错误/ AndroidRuntime(13130):引起:org.xmlpull.v1.XmlPullParserException:二进制XML文件行#6:标记需要一个'drawable'属性或定义drawable的子标记

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

令我困惑的是我可以设置颜色参考,例如“@ color / black”,直接作为背景属性。这是按预期工作的。使用选择器不起作用。

我也可以将选择器用作android:background="@color/selector"而没有问题。

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

5 个答案:

答案 0 :(得分:213)

问题在于您无法使用颜色选择器定义背景颜色,需要可绘制选择器。因此,必要的更改将如下所示:

<?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获取图像资源的原因可能是因为他试图仅使用@drawable来引用仍然在颜色目录中的资源,所以他结束了与ID冲突,选择错误的资源。

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

答案 1 :(得分:110)

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>

答案 2 :(得分:79)

上述更简单的解决方案:

<?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文件夹中,你就可以了。

答案 3 :(得分: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属性,其值为颜色。

顺便说一句,他们为什么说colorselector的属性之一?他们并不认为android:drawable是必需的。

Color State List Resource

<?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>

答案 4 :(得分:4)

如果在没有创建背景部门的情况下搜索谁,只需将这些行添加到TextView

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

也可以选择使用:

android:textIsSelectable="true"