因为要为button设置不同状态下不同的背景,写了一个selector,如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/pic_01" android:state_pressed="true"></item>
<item android:drawable="@mipmap/pic_02" android:state_pressed="false"></item>
<item android:drawable="@drawable/shape_square" android:state_enabled="false"/>
</selector>
但是在使用时,设置 button.setEnabled(false)背景却无任何变化。
试着把state_enabled放在最前面:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_square" android:state_enabled="false"/>
<item android:drawable="@mipmap/pic_01" android:state_pressed="true"></item>
<item android:drawable="@mipmap/pic_02" android:state_pressed="false"></item>
</selector>
这样再设置button.setEnable(false)背景显示正常了。Why???
查了相关资料发现:
selector中各个item的顺序是会影响实际效果的(敲黑板!!!)
selector的item从上到下是按照匹配原则来改变状态的,一旦匹配到某个item的状态,就不会继续往下匹配。
例如:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/pressed"/>
<item android:drawable="@drawable/normal"/>
</selector>
这样设置 button按下就会有背景上的变化。然而,如果item换一下顺序:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/normal"/>
<item android:state_pressed="true" android:drawable="@drawable/pressed"/>
</selector>
这样再把button按下 背景不会有任何变化。
当<item android:drawable="@drawable/normal"/>这个item在第一个,就匹配了按钮正常的状态,然后就不会往下匹配,也就是说下面那个press的item将永远不会被执行。这就是 一旦匹配到某个item的状态,就不会继续往下匹配这句话的意思。
再举一个例子:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/background_pressed">
<item android:state_pressed="false" android:drawable="@drawable/background_normal">
<item android:state_selected="true" android:drawable="@drawable/background_pressed">
<item android:state_enabled="true" android:drawable="@drawable/background_normal">
</selector>
点击按钮时会看到按钮的高亮状态,然后又恢复正常,这一过程执行的动作是:“点击”,在手指离开按钮之后 第二条` <item android:state_pressed="false" android:drawable="@drawable/background_pressed" > `肯定会满足匹配条件,所以后面的`item`都不会执行。
重点:一旦匹配到某个item的状态,就不会继续往下匹配!!