TextView背景颜色的选择器

dig*_*eed 120 android

我试图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>
Run Code Online (Sandbox Code Playgroud)

clickable该属性TextView就是true那的利益,以备不时之需.

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

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

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

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

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

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

Ben*_*tin 221

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

<?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>
Run Code Online (Sandbox Code Playgroud)

您还需要将该资源移动到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>
Run Code Online (Sandbox Code Playgroud)

最后,你会像这样使用它:

android:background="@drawable/selector"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为什么不直接在选择器项中直接使用"drawable ="@ color/your_color"?您不需要定义任何形状或任何其他文件,只需在values/colors.xml中定义颜色定义(它总是好的)不要硬编码颜色). (9认同)

azd*_*dev 117

Benoit的解决方案可行,但您实际上不需要承担绘制形状的开销.由于颜色可以绘制,只需在/res/values/colors.xml文件中定义颜色:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="semitransparent_white">#77ffffff</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后在你的选择器中使用:

<?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>
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 82

以上更简单的解决方案:

<?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>
Run Code Online (Sandbox Code Playgroud)

保存在drawable文件夹中,你很高兴.

  • 这就是我认为的解决方案. (6认同)

Mak*_*iev 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


Das*_*uni 5

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

android:background="?android:attr/selectableItemBackground"
android:clickable="true"
Run Code Online (Sandbox Code Playgroud)

还使其可选使用:

android:textIsSelectable="true"
Run Code Online (Sandbox Code Playgroud)