状态列表可绘制和禁用状态

Igo*_*pov 47 android android-layout

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

android:enabled="false"
Run Code Online (Sandbox Code Playgroud)

这是后台的资源文件:

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

但禁用后按钮仍然具有正常背景.我错过了什么?

小智 133

把这一行:

<item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/>
Run Code Online (Sandbox Code Playgroud)

作为第一个项目(它必须是第一项,否则将无法正常工作)的的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>
Run Code Online (Sandbox Code Playgroud)

  • 为什么是这样!?疯狂的愚蠢规则:/ (18认同)
  • @Estel我不认为这是一个疯狂的愚蠢规则.将选择器视为开关盒.将选择器中的每个项目视为"case"语句,最后使用"break".第一项是:`<item android:state_pressed ="false"android:drawable ="@ drawable/bttn_orange_normal"/>`这是真的,将设置正常的背景. (18认同)

The*_*eIT 31

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