想将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",才“激活”选择器生效,我这边也顺便试了下,貌似没设置这个属性也没什么关系,一样生效了。
时间: 2024-11-05 17:19:05