android: drawable中同时设置state_enabled和和state_pressed不起作用的问题

 直接说结论,一定要注意selector中各个属性的顺序问题,比如要同时设置按钮的按下及可用状态,必须按照下列顺序编写:

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

    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="#A5BBE9" />
            <corners android:radius="4dip" />
        </shape>
    </item>

    <item android:state_pressed="false">
        <shape android:shape="rectangle">
            <solid android:color="@color/app_color_dark" />
            <corners android:radius="4dip" />
        </shape>
    </item>

    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/app_color" />
            <corners android:radius="4dip" />
        </shape>
    </item>

</selector>

注意! android:state_enabled="false"  必须在最上面,如果写成:

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

    <item android:state_pressed="false">
        <shape android:shape="rectangle">
            <solid android:color="@color/app_color_dark" />
            <corners android:radius="4dip" />
        </shape>
    </item>

    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/app_color" />
            <corners android:radius="4dip" />
        </shape>
    </item>

    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="#A5BBE9" />
            <corners android:radius="4dip" />
        </shape>
    </item>

</selector>

那么直接设置 button.setEnabled(false)背景是没有任何变化的,算是android的一个坑吧,据说是因为这样:

selector中各个item的顺序是会影响实际效果的, selector的item从上到下是按照匹配原则来改变状态的,一旦匹配到某个item的状态,就不会继续往下匹配

详情可参考:Android selector中设置 android:state_enabled 不起作用问题的解决

 

posted @ 2021-03-25 15:42  夜行过客  阅读(580)  评论(0编辑  收藏  举报