selector常常用于設定按鈕等控件在不同狀态下的顯示,例如預設下的顔色,按下時候的顔色等等,但是需要注意的一點是,selector中各個item的順序是會影響實際效果,這也是常常有人設定了selector但是無效的原因。
selector常用的寫法如下:
<?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/state_pressed" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/state_pressed" />
<item android:state_selected="true" android:drawable="@drawable/state_pressed" />
<item android:drawable="@drawable/state_normal" />
</selector>
大家常見的都是把state_focus、state_selected都用上是因為這樣可以适用于類似RadioGroup等控件。其實對于按鈕來說,如果隻是想在點選的瞬間改變其狀态的話,隻需要一個state_pressed就可以了,如下:
<?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/state_pressed"/>
<item android:drawable="@drawable/state_normal"/>
</selector>
這樣按鈕按下的瞬間就會發生改變,例如顔色變化,圓角變化等等。
如果我把上述代碼的item換一下順序,如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/state_normal" />
<item android:drawable="@drawable/state_pressed" android:state_pressed="true" />
</selector>
大家會發現按下按鈕的時候會沒有反應。這是由于selector的item從上到下是按照比對原則來改變狀态的,一旦比對到某個item的狀态,就不會繼續往下比對了。
大家還要注意的一點是第一個item:
實質等同于
也就是說,state_enable是預設狀态,控件預設是enable的,是以無論是預設狀态還是當你點選的時候,都是可以比對到第一個item,比對成功後,下面的item,即state_pressed是不會被比對的。
是以還有一點要注意!
如果給LinearLayout等View設定selector是無效的,因為其enable屬性預設是false,而selector中item的預設屬性是state_enable=”true”,是以無論你的順序如何調整都不會有效果,是以在xml中設定enable屬性即可。