当用户触摸时,我正在尝试更改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
的正确方法是什么?
答案 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
属性,其值为颜色。
顺便说一句,他们为什么说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>
答案 4 :(得分:4)
如果在没有创建背景部门的情况下搜索谁,只需将这些行添加到TextView
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
也可以选择使用:
android:textIsSelectable="true"