selector可以用来实现不同状态之间的不同表现
selector标签,用多个item定义不同状态的表现。
定义的xml文件可以作为两种资源使用:drawable和color。
作为drawable资源使用时必须指定android:drawable属性,一般用来改变形状、背景颜色等;
作为color资源使用时必须指定android:color属性,一般用来改变文本的颜色。
作drawable使用时:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 按压时 -->
<item android:drawable="@drawable/btn_bg_pressed" android:state_pressed="true" />
<!-- 默认时 -->
<item android:drawable="@drawable/btn_bg_normal" />
</selector>
作color使用时:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 按压时 -->
<item android:color="@android:color/holo_blue_light" android:state_pressed="true" />
<!-- 默认时 -->
<item android:color="@android:color/white" />
</selector>
Note
- item是从上往下匹配的,如果匹配到一个item那它就将采用这个item,而不是采用最佳匹配的规则;所以设置默认的状态,一定要写在最后,如果写在前面,则后面所有的item都不会起作用了。
- selector标签下有两个比较有用的属性,添加了下面两个属性之后,状态改变时会出现淡入淡出效果
API Level 11及以上才支持:
android:enterFadeDuration 状态改变时,新状态展示时的淡入时间,以毫秒为单位
android:exitFadeDuration 状态改变时,旧状态消失时的淡出时间,以毫秒为单
属性详细说明
android:state_enabled: 是否可点击或触摸,一般只在false时设置该属性,表示不可用状态
android:state_pressed: 按压状态,一般在true时设置该属性,表示已按压状态,默认为false
android:state_selected: 选中状态,true表示已选中,false表示未选中
android:state_checked: 勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
android:state_checkable: 是否可勾选,类似state_enabled
android:state_focused: 焦点状态,true表示获得焦点,默认为false
android:state_window_focused: 当前窗口是否获得焦点,true表示获得焦点,false表示未获得焦点,
例如拉下通知栏或弹出对话框遮挡当前界面,当前界面就会失去焦点;
另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身
android:state_activated: 激活状态,true表示被激活,false表示未激活
API Level 11及以上才支持,可通过代码调用控件的setActivated(boolean)方法设置是否激活该控件
android:state_hovered: 鼠标经过,true表示鼠标在上面滑动,默认为false
API Level 14及以上才支持