android selector 小坑
- 常见selector属性
- 使用selector遇到的问题
常见selector属性
- android:state_selected是选中
- android:state_focused是获得焦点
- android:state_pressed是点击
- android:state_enabled是设置是否响应事件,指所有事件
- android:state_checkable一般用于单复选框
- android:state_window_focused表示应用程序窗口有无焦点时使用
使用selector遇到的问题
有时候,我们会有一些特殊的需求如选中一个按钮时,未选中时,还有就是禁用按钮,实现多个状态下的一个selector。这时我们发现如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/green" android:state_pressed="true" />
<item android:drawable="@color/red" android:state_enabled="false" />
<item android:drawable="@color/blue" android:state_pressed="false"/>
</selector>
上述xml配置中,使用java代码将按钮或View setEnabled(false)都达不到我们预想的效果,禁用按钮或View的状态没法显示,selector原理是通过匹配到最近的地方与switch语句类似后,不再继续向下匹配,因而结果不一定是最匹配的。而为了使selector能更好匹配,我们一般将无状态也就是正常状态放在最后且尽量指明互斥的量。如下面代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/red" android:state_enabled="false" />
<item android:drawable="@color/blue" android:state_enabled="true" android:state_pressed="false"/>
<item android:drawable="@color/green" android:state_enabled="true" android:state_pressed="true" />
</selector>
如禁用状态(state_enabled)和非禁用状态(state_pressed)