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>的用法就结束吧。

 

 

 

selector标签,这个标签是必要的标签,而且应当作为XML文件的根节点,在selector可以有一或多个item子标签
在selector标签中,我们可以配置以下几种属性:
            xmlns:android="http://schemas.android.com/apk/res/android"    这个是android的命名空间,默认这么写就可以
 
            android:constantSize     这个是布尔型,false表示各个状态的大小(size)各自不同,true表中所有的状态大小相同(以最大的为准)。默认为false
 
       android:dither  布尔型。true表示,如果一个屏幕中位图有这不同的像素配置,启用位图的抖动。false表示不启用位图的抖动。默认为true据度娘:dither,抖动,是一种故意造成的噪音用以随机化量化误差,阻止大幅度拉升图像时导致的像banding(色带)这样的问题。
 
       android:variablePadding 布尔型。选择true时,drawable的内边距会根据状态的变化而变化,设置为true时,你必须为不同的状态配置layout,但是通常不建议这么做。选择false时,内边距保持一致,所有状态中最大的内边距。默认为false
 
 
接下来是Item标签
item标签,通过一些属性的配置,定义drawable的特定状态。该标签必须作为selector的子标签。
在item标签中,我们可以配置一下几种属性
 

android:drawable

这个属性是必须的,为当前控件指定资源。

android:state_pressed

布尔值。true指当用户点击或者触摸该控件的状态。默认为false

android:state_focused

布尔值。ture指当前控件获得焦点时的状态。默认为false

android:state_hovered

布尔值。true表示光标移动到当前控件上的状态。默认为false

android:state_selected

布尔值。true表示被选择的状态,例如在一个下拉列表中用方向键下选择其中一个选项。

这个和focus的区别,selectedfocus不充分的情况。比如一个listview获得焦点(focus),而用方向键选择了其中的一个itemselected

android:state_checkable

布尔值。ture表示可以被勾选的状态。这个仅在当控件具有被勾选和不被勾选的状态间转换时才起作用。 

android:state_checked

布尔值。true表示当前控件处于被勾选(check的状态) 

android:state_enabled

布尔值。true表示当前控件出于可用的状态。比如可以被点击 

android:state_activated

布尔值。true表示当前控件被激活的状态。

android:state_window_focused

布尔值。true表示当前控件出于最前端时,应用窗口获得焦点的状态。

 

posted @ 2018-02-06 13:54  天长地久-无为  阅读(5384)  评论(0编辑  收藏  举报