今天寫一個用兩個自定義的TextView控制ViewPager的時候,想實現點擊TextView處於選中狀態,
selector就選中<item>中的state_selected所對應的圖片。
selector中按往常的習慣這樣寫的
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/icon_selfinfo_pressed" android:state_selected="true" /> <item android:drawable="@drawable/icon_selfinfo_pressed" android:state_pressed="true" /> <item android:drawable="@drawable/icon_selfinfo_normal" /> </selector>
但是我在使用的時候設置tv.setSelected(true)的時候,始終只是按下一個狀態,彈起恢復原來的狀態,達不到我想要的selected狀態。
分析了很多原因,有說按順序從上到下選匹配的:
During each state change, the state list is traversed top to bottom and the first item that matches the current state will be used—the selection is not
based on the "best match," but simply the first item that meets the minimum criteria of the state.
但是我做過測試,如上講selected狀態放到最上面,但是還是沒有setSeleted(true)的效果。估計還是匹配不了吧
估計在pressed和selected狀態時候,我們點擊匹配的都是pressed。
后面轉換了下思想,沒必要用state_pressed屬性,直接這樣寫達到了目的:
<item android:drawable="@drawable/icon_selfinfo_pressed" android:state_selected="true" /> <item android:drawable="@drawable/icon_selfinfo_normal" android:state_selected="false" /> <item android:drawable="@drawable/icon_selfinfo_normal" />
而且state_pressed和state_selected一起使用本身就覺得很奇怪,
到底是要pressed的點擊一個狀態,彈起呈現另一個狀態,還是要selected的點擊就一直選中狀態?
歸根到底兩個一起使用不明確,我自己感覺意義也不大。
於是今天到此為止,總結下<selector>的用法就結束吧。
android:drawable
這個屬性是必須的,為當前控件指定資源。
android:state_pressed
布爾值。true指當用戶點擊或者觸摸該控件的狀態。默認為false
android:state_focused
布爾值。ture指當前控件獲得焦點時的狀態。默認為false
android:state_hovered
布爾值。true表示光標移動到當前控件上的狀態。默認為false
android:state_selected
布爾值。true表示被選擇的狀態,例如在一個下拉列表中用方向鍵下選擇其中一個選項。
這個和focus的區別,selected是focus不充分的情況。比如一個listview獲得焦點(focus),而用方向鍵選擇了其中的一個item(selected)
android:state_checkable
布爾值。ture表示可以被勾選的狀態。這個僅在當控件具有被勾選和不被勾選的狀態間轉換時才起作用。
android:state_checked
布爾值。true表示當前控件處於被勾選(check的狀態)
android:state_enabled
布爾值。true表示當前控件出於可用的狀態。比如可以被點擊
android:state_activated
布爾值。true表示當前控件被激活的狀態。
android:state_window_focused
布爾值。true表示當前控件出於最前端時,應用窗口獲得焦點的狀態。