首页 文章

TextView背景颜色的选择器

提问于
浏览
115

我试图在用户触摸它时更改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>

如果感兴趣的话, TextViewclickable 属性是 true .

当我将此选择器分配给 TextView 作为 android:background="@color/selector" 时,我在运行时收到以下异常:

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

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

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

我也可以使用选择器作为 textColor 没有问题 .

What's the correct way to apply a background-color-selector to a TextView in Android?

5 回答

  • 15

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

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

    Note :OP获取图像资源的原因可能是因为他试图仅引用仍然在颜色目录中的资源但是使用 @drawable 所以他最终导致了ID冲突,选择了错误的资源 .

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

  • 78

    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>
    
  • 109

    以上更简单的解决方案:

    <?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文件夹中,你很高兴 .

  • 4

    即便如此 .

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

    对于谁在不创建背景扇区的情况下进行搜索,只需将这些行添加到 TextView

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

    也可以选择使用:

    android:textIsSelectable="true"
    

相关问题