【问题标题】:State list drawable and disabled state状态列表可绘制和禁用状态
【发布时间】:2012-12-26 15:51:13
【问题描述】:

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

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>

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

【问题讨论】:

  • 尝试在第一个项目部分添加 android:state_enabled="true"
  • pressed false 未按下。此外,不指定状态也不意味着错误。这意味着它不被考虑。所以,这里的规则意味着任何时候没有按下按钮,它都有正常的背景。
  • 你必须删除最后一项的android:state_enabled="true",这样所有其他状态都会有@drawable/bttn_orange_normal。一旦您的按钮被禁用,它将在正确的位置获得 @drawable/bttn_grey_disabled。此外,您必须删除具有 android:state_pressed="false" 的行,因为它将覆盖 android:state_enabled="false"的定义>

标签: android android-layout


【解决方案1】:

把这一行:

<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>

【讨论】:

  • @Estel 我不认为这是一个疯狂愚蠢的规则。将选择器视为开关盒。将选择器中的每个项目视为末尾带有“break”的“case”语句。第一项是:&lt;item android:state_pressed="false" android:drawable="@drawable/bttn_orange_normal" /&gt;,为真,设置正常背景。
【解决方案2】:

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>

【讨论】:

    【解决方案3】:

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

    <?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>
    

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 2011-11-11
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多