如何设置自定义按钮状态的背景颜色?

9
我有一个包含图像和文本的按钮。我希望该按钮的背景与提供的普通背景不同(最好是纯色)。这很简单,我只需在XML文件中使用android:background属性并相应地分配颜色即可。但是,当选定或聚焦时,我想将背景更改为不同的颜色(状态选择器)。
我尝试在drawable文件夹中创建一个具有定义颜色的选择器(在处理按钮文本时效果很好),如下所示:
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_focused="true" android:state_pressed="false" android:color="@color/green" />
        <item android:state_focused="true" android:state_pressed="true" android:color="@color/green" />
        <item android:state_focused="false" android:state_pressed="true" android:color="@color/green" />
        <item android:color="@color/white" />
    </selector> 

将此xml设置为android:background属性,如下所示:

android:background="@drawable/button_state"

但这会导致强制关闭,并显示以下错误信息:
 Caused by: android.content.res.Resources$NotFoundException: File res/drawable/button_state.xml from drawable resource ID #0x7f020070

但是资源已经存在。您不能自定义背景状态吗?如果可以,怎么做?或者我做错了什么?感谢帮助!


1
你绝对可以将选择器用作背景可绘制对象。你把 button_state.xml 文件放在哪里了? - Ted Hopp
我像往常一样将它放在drawable文件夹中。但是在启动应用程序时,它会强制关闭,因此它必须没有识别我的xml文件。 - chRyNaN
也许它确实识别了xml文件,如果我在textColor属性中使用它,它就能正常工作。只有当我将其用于background属性时,它才会强制关闭。 - chRyNaN
2个回答

12
你发布的XML适用于颜色状态列表,而不是状态列表可绘制项。请尝试使用以下内容:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" >
        <shape><solid android:color="@color/green"/></shape>
    </item>
    . . .
</selector>

或者,将您现有的文件放入res/color目录中,并像使用其他颜色一样使用它。但是,我不记得您是否可以直接将颜色状态列表用作视图的背景。


好的,只是为了我正确理解这个工作原理:当使用状态选择器来设置button的背景时,选择器XML中定义的背景资源应该是一个drawable吗? - chRyNaN
2
@AndroidStudent - 没错。在Android内部,状态列表可绘制对象和颜色状态列表之间存在很大的区别。可绘制状态列表只需要引用其他可绘制对象。这有点令人困惑,因为API似乎允许在需要可绘制对象引用的地方使用颜色引用,但这只是一种不适用于所有情况的便利。 - Ted Hopp

2

示例:

XML file saved at res/color/button_text.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="#ffff0000"/> <!-- pressed -->
        <item android:state_focused="true"
              android:color="#ff0000ff"/> <!-- focused -->
        <item android:color="#ff000000"/> <!-- default -->
    </selector>
    This layout XML will apply the color list to a View:

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_text"
        android:textColor="@color/button_text" />

@color/button_text

res/color/button_text.xml

这是Google在ColorStateList Resource中提供的示例: https://developer.android.com/guide/topics/resources/color-list-resource.html

我认为应该使用colorStateList来改变小部件的textView的颜色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接