【原创】Android selector选择器无效或无法正常显示的一点研究

想将LinearLayout作为一个按钮,加上一个动态背景,按下的时候,背景变色,这个理所当然应该使用selector背景选择器来做:

  <LinearLayout
                    android:id="@+id/btn_user_profit_record"
                    android:layout_width="0dp"
                    android:layout_height="130dp"
                    android:layout_weight="1"
                    android:background="@drawable/bg_selector"
                    android:gravity="center"
                    android:orientation="vertical">
 </LinearLayout>

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/white"/>
    <item android:drawable="@color/white_dark" android:state_pressed="true"/>
</selector>

这样写了之后,死活都没有效果,一直都不变色,多方尝试之后发现,有人写的类似的selector是将上面一行设置为stat_pressed="false",我尝试了一下,果然有效了

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/white" android:state_pressed="false"/>
    <item android:drawable="@color/white_dark" android:state_pressed="true"/>
</selector>

更深一层的思考,为什么会这样?设置一个默认的状态,应该是可行的,不需要这样全部都指明,由此想到是不是与顺序有关,作为一个selector,可能是按照顺序来对照判断的,那么每次状态改变要判断的时候,肯定都满足第一个(因为什么条件都没有),所以其他的都不会生效,因此我做了这样的修改:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/white_dark" android:state_pressed="true"/>
    <item android:drawable="@color/white"/>
</selector>

将默认状态移到最下面,果然能正常生效了,这也证明了我刚才的想法是正确的。

 

倒是确实没有想到selector里的项目还会有顺序(没怎么仔细看官方文档,我的锅),看来以后对于比较复杂的selector怎么排序应该要仔细一点了。

 

另外之前网上搜索的时候看到有人指出,对于layout要指定clickable="true",才“激活”选择器生效,我这边也顺便试了下,貌似没设置这个属性也没什么关系,一样生效了。

posted @ 2015-06-30 18:02  sky0014  阅读(6620)  评论(0编辑  收藏  举报