1. 程式人生 > >安卓selector使用及注意事項

安卓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與圖片名重名,那麼預設將呼叫圖片。