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 不起作用问题的解决