56

我有一个按钮,我希望它在设置时具有不同的背景:

android:enabled="false"

这是背景的资源文件:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false"
          android:drawable="@drawable/bttn_orange_normal" /> <!-- pressed -->
    <item android:state_pressed="true"
          android:drawable="@drawable/bttn_orange_selected" /> <!-- focused -->
    <item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/>
    <item android:state_enabled="true" android:drawable="@drawable/bttn_orange_normal"/>
</selector>

但是按钮在禁用时仍然具有正常背景。我错过了什么?

4

3 回答 3

157

把这一行:

<item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/>

作为标签的第一项(它必​​须是第一项,否则它将不起作用) 。selector

最后 :

<selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/>
            <item android:state_pressed="false"
              android:drawable="@drawable/bttn_orange_normal" /> <!-- pressed -->
            <item android:state_pressed="true"
              android:drawable="@drawable/bttn_orange_selected" /> <!-- focused -->
            <item android:state_enabled="true" android:drawable="@drawable/bttn_orange_normal"/> <!-- idle state -->
</selector>
于 2012-12-26T16:56:05.500 回答
37

Vincent Ducastel 的回答是正确的,但它没有描述解决方案为何有效。

当 Android 遍历可用项目列表时,它会从上到下遍历列表,在每种情况下评估视图的当前状态是否与为每个项目定义的状态匹配。然后它选择与条件匹配的第一个项目并忽略其余项目。

这就是为什么您应该始终在列表底部提供一个默认项,并提供一种显示复杂选择条件的方法。例如,如果您希望在项目被禁用时具有特殊的按下状态,您将定义以下项目:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    ...
    <item android:state_enabled="false" android:state_pressed="false" android:drawable="@drawable/btn_grey_disabled"/>
    <item android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/btn_white_disabled_selected"/>
    ...
</selector>
于 2016-07-07T01:07:22.773 回答
0

添加了活动、默认和禁用状态的示例

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!--Disable-->
    <item android:drawable="@drawable/ic_button_disable"
        android:state_enabled="false" 
        android:state_pressed="false" />

    <item android:drawable="@drawable/ic_button_disable_touch" 
        android:state_enabled="false" 
        android:state_pressed="true" />


    <!--Default-->
    <item android:drawable="@drawable/ic_button_default"  
        android:state_pressed="false"    
        android:state_selected="false" />

    <item android:drawable="@drawable/ic_button_default_touch" 
        android:state_pressed="true" 
        android:state_selected="false"  />


    <!--Active-->
    <item android:drawable="@drawable/ic_button_active" 
        android:state_enabled="true" 
        android:state_selected="true" 
        android:state_pressed="false" />

    <item android:drawable="@drawable/ic_button_active_touch" 
        android:state_enabled="true" 
        android:state_pressed="true" 
        android:state_selected="true" />
</selector>
于 2020-11-26T22:24:22.933 回答