背景:给控件不同状态设置背景色时,经常起不到效果,百思不得其解,后面才发现<selector>中的<item>需要按一定顺序排列,下面对Selector的用法以及需要注意事项进行说明。
说明
selector集合定义在xml文件里面,View对象背景颜色的选择取决于自身当前的状态,总共有pressed、focused、selected、checkable、checked、enabled、window_focused和default八种状态,View对象的每一种状态可以设置不同的背景色。
匹配规则
我们知道可以给一个对象的多种状态设置不同的背景颜色,那么对象是如何根据状态来匹配颜色呢?规则是:根据当前对象状态,在selector集合中从上到下匹配,被匹配到的第一项<item>作为对象的背景色。
注意点
1、因为匹配的第一项作为当前View对象的背景颜色,结束匹配。如果第一项每次都能被匹配到,就不会往下匹配,那么之后的状态也就失效了。然而每一个View对象都有默认状态,所以这也就是为什么默认状态不能放在开头,而要放到最后的原因。
2、不是所有的View子类都拥有八种状态,比如Button对象,拥有pressed、enabled、window_focused、default四种状态,如果设置selected是无效的,所以要根据组件的具体情况设置。
3、状态的顺序排放。
pressed->focused->selected->checkable->checked->enabled->window_focused->default
具体排放顺序还得根据当前View对象拥有的状态来排列。记住默认的权重是最大的,要放在最后面。
语法
有些同学可能会问这些状态是什么意思,什么时候被触发?
android:state_enabled
View对象没有被禁用时触发,即android:enabled="true",否则失效。android:state_window_focused
当前Activity拥有用户输入焦点时被触发,即显示在最前端,如果有退出后台或者弹出Dialog会失效。
其他都好理解,这里就不做解释了。
应用
以一个Button按钮为例,点击按钮切换背景颜色。
- 在res/drawable目录下创建btn_touch_feedback.xml文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/colorAccent"></item>
<item android:drawable="@color/line"/>
</selector>
2.在Button中应用
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_touch_feedback"
android:text="点击按钮"/>
来看我文章的同学们,如果觉得写的不错,给我点个赞吧!