天天看點

Android 關于selector中item順序的問題

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屬性即可。