Android中Selector的setSelected“方法不管用”
今天写一个用两个自定义的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表示当前控件出于最前端时,应用窗口获得焦点的状态。