###Selector使用与避坑总结
###selector文件item节点下android:state_XXXX属性坑
人生苦短,及时避坑。
之前遇到了明明selector选择器android:state_XXXX属性与java代码中状态改变一致,却就是不生效的坑。
浪费了几个小时的时间,终于将这个原因排查出来了。
顺序顺序顺序!!
重要的事情说三遍,一定要注意item各个状态的顺序问题!
例如:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false">
<shape android:shape="rectangle">
<solid android:color="@color/gray_CCCCCC" />
</shape>
</item>
<item android:state_enabled="true">
<shape android:shape="rectangle">
<solid android:color="@color/colorTheme" />
</shape>
</item>
</selector>
和
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<shape android:shape="rectangle">
<solid android:color="@color/colorTheme" />
</shape>
</item>
<item android:state_enabled="false">
<shape android:shape="rectangle">
<solid android:color="@color/gray_CCCCCC" />
</shape>
</item>
</selector>
是不一样的,item的state顺序很重要,否则代码中改变View状态Selector是不会有动作的,这一块可能是一个官方的一个坑吧,以后再看源码分析原因。
目前的使用一定要注意:后写View默认状态
。
拿上面的state_enable
属性举例,View默认状态enable的状态是true,如果把item的enable_state=true属性先写(第二段代码那样),那么在java代码中动态设置view.Enabled = true或false
都是无法生效的。
正确写法一定要把View默认状态对应的state写在最后(第一段代码)
###举个例子
例如:项目中有一种常用效果,如果按钮可以点击,则高亮按钮。如果不可点击,则将按钮置灰。
用selector文件可以很简单的实现。
-
首先在drawable文件下新建selector文件:
这个文件即表示enable为true(可点击)时,颜色为鲜绿色。如果enable为false(不可点击时),颜色为灰色。
**注意:**android:state_enabled="false"属性的item节点放到最后,否则无效果。这也是这篇文章存在的理由,顺序很重要。
-
接下来将selector应用到按钮背景色中。在Android Studio中可以实时预览selector效果。
-
最后在java代码中修改View的可选中状态。
mSelectedV2Binding.btnSure.setEnabled(true);
mSelectedV2Binding.btnSure.setEnabled(false);
运行测试没问题,避坑完毕。
Enabled与setClickable的区别,请参考传送门。
- 列举一些默认状态:
- state_enabled默认为true,所以android:state_enabled="true"需要最后写。
- state_selected默认为false,android:state_enabled="false"顺序放到最后。
- state_pressed默认为false,android:state_pressed="false"书写顺序最后写。
- …
###渐变
shape中提供了gradient
节点,可以用来实现一个渐变的效果;
上代码:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="0"
android:endColor="@color/tran_00f1f1f1"
android:startColor="@color/tran_f4f4f4"
android:type="linear" />
</shape>
这段代码就实现了一个渐变效果的矩形,配合selector用在按钮上,就可以满足很多日常所需了。
angle
:角度,水平为0.endColor
:结束颜色startColor
:开始颜色type
:渐变类型- linear 线性渐变
- sweep 扫描渐变
- radial 辐射渐变,中心向周围辐射状的渐变。
效果图: