国家列表绘制和禁用状态

问题描述 投票:43回答:2

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

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 android-layout
2个回答
131
投票

把这一行:

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

28
投票

文森特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>
© www.soinside.com 2019 - 2024. All rights reserved.