安卓selector使用及注意事項
如題,主要是安卓selector的使用及注意事項
一、selector的建立
我是使用安卓studio 版本:3.1.4,專案樹切換到Android檢視,在目錄App->new-> Android Resource File
方式2: res->new-> Android Resource File
方式3:drawable->new-> Drawable Resource File
Directory name選擇drawable,填寫一個檔名,生成檔案內容如下:
推薦第三種方式,比較方便一些。
二、selector寫法
常用樣式
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 非觸控模式(有焦點有點選)按下的時候 --> <item android:state_focused="true" android:state_pressed="true"> <!-- 觸控模式(無焦點有點選)按下的時候 --> <item android:state_focused="false" android:state_pressed="true"> <!-- 有焦點的時候 --> <item android:state_focused="true"> <!-- 無焦點的時候 --> <item android:state_focused="false"> <!-- selected狀態選中的時候 --> <item android:state_selected="true"> <!-- checked狀態選中的時候 --> <item android:state_checked="true"> </selector>
三、使用注意事項
1. selector中item的順序執行問題:
selector中的item的狀態判斷是由上而下進行判斷的,一旦匹配到該狀態,那麼之後的狀態就不再進行匹配。
比如下邊程式碼:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/btn_unenable" android:state_enabled="false" /> <item android:drawable="@color/colorPrimary" android:state_pressed="false" /> <item android:drawable="@color/colorPrimaryDark" android:state_pressed="true" /> </selector>
分析:共有三種狀態:不可用、按下、未按下,此時三種狀態都可以正常運作。如果調整順序如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/colorPrimary" android:state_pressed="false" />
<item android:drawable="@color/colorPrimaryDark" android:state_pressed="true" />
<item android:drawable="@color/btn_unenable" android:state_enabled="false" />
</selector>
會發現:不可用狀態會匹配不到,因為會先匹配到 未按下狀態,之後就不再進行匹配了。
解決方式:
* 將兩者互有包含的狀態進行詳細的區分,做到互不包含;
* 將更加具體的狀態順序調整到不夠具體狀態的上面;
2. selector完全不起作用:
可能view設定了不可見狀態或者不可使用狀態(android:enabled="false",或者使用android:clickable="false")
可能是對view.setOnTouchListener(),返回值是true的時候。
說明:selector生效的前提是當前控制元件是clickable="true",安卓中有些控制元件是預設可點選的,但是有些不是,比如ViewGroup這些
,如果一個控制元件設定了onClickListener,那麼該控制元件將預設設定為clickable="true"。view.setOnTouchListener(),返回值是true時,
該view的onClick事件將無法接收到,即clickable="false"
3. selector與圖片名重名,那麼預設將呼叫圖片。