【问题标题】:How to set custom button state background color?如何设置自定义按钮状态背景颜色?
【发布时间】:2012-12-31 18:40:58
【问题描述】:

我有一个包含可绘制对象和文本的按钮。我希望按钮的背景与提供的正常背景不同(最好是纯色)。这很好用,我只需在 XML 文件中使用 android:background 属性并相应地分配颜色。但是,我希望背景在被选中或聚焦(状态选择器)时变为不同的颜色。

我尝试在一个可绘制文件夹中创建一个具有定义颜色的选择器(在处理按钮文本时效果很好),如下所示:

    <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

但是资源在那里。不能自定义后台状态吗?如果可以,怎么做?或者我做错了什么?感谢您的帮助!

【问题讨论】:

  • 您绝对可以将选择器用作背景可绘制对象。你到底把button_state.xml放在哪里了?
  • 我像往常一样把它放在了drawable文件夹中。并且在启动时应用程序强制关闭,因此它不能确认我的 xml 文件
  • 或者它可以识别 xml 文件,因为如果我将它与 textColor 属性一起使用,它可以正常工作。只有当我将它与背景属性一起使用时,它才会强制关闭

标签: java android button background


【解决方案1】:

您发布的 xml 适合 color state list,而不是可绘制的状态列表。试试这个:

<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?跨度>
  • @AndroidStudent - 没错。可绘制状态列表和颜色状态列表之间存在很大差异(在 Android 内部)。可绘制状态列表只需要引用其他可绘制对象。这有点令人困惑,因为 API 似乎允许在需要可绘制引用的地方使用颜色引用,但这种便利并不适用于任何地方。
【解决方案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 资源中提供的示例: https://developer.android.com/guide/topics/resources/color-list-resource.html

我认为 colorStateList 必须用于更改小部件的 textView 的颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多