selector标签中每个Drawable都对应着View的一种状态,这样系统会根据View的状态来选择合适的Drawable。主要用于设置可点击View的背景。比如在ListView的item,TextView,Button,CheckBox等控件。
()< selector >标签
android:constantSize
selector的固有大小是否不随着其状态的改变而改变,true表示selector的固有大小保持不变。这时它的固有大小是内部所有Drawable的固有大小的最大值。false(默认值)表示会改变。
android:dither
是否开启抖动效果,默认值为true。
android:variablePadding
selector的padding是否随着其状态的改变而改变。true表示会改变,false(默认值)表示selector的padding是内部所有的Drawable的padding的最大值,建议不开启。
()< item >标签
android:state_focused
设置是否获得焦点状态,true表示获得焦点,默认为false,表示未获得焦点。
android:state_window_focused
设置当前窗口是否获得焦点状态,true表示获得焦点,false表示未获得焦点,
例如拉下通知栏或弹出对话框时,当前界面就会失去焦点;
另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身。
android:state_enabled
设置触摸或点击事件是否可用状态,一般只在false时设置该属性,表示不可用状态。
android:state_checkable
设置勾选是否可用状态,
类似state_enabled,只是state_enabled会影响触摸或点击事件,而state_checkable影响勾选事件。
android:state_checked
设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选。
android:state_selected
设置是否选中状态,true表示已选中,false表示未选中
android:state_pressed
设置是否按压状态,一般在true时设置该属性,表示已按压状态,默认为false。
android:state_activated
设置是否被激活状态,true表示被激活,false表示未激活,
API Level 11及以上才支持,可通过代码调用控件的setActivated(boolean)方法设置是否激活该控件。
android:state_active
android:state_single
android:state_first
android:state_middle
android:state_last
android:state_accelerated
android:state_hovered
设置是否鼠标在上面滑动的状态,true表示鼠标在上面滑动,默认为false,API Level 14及以上才支持。
android:state_drag_can_accept
android:state_drag_hovered
android:state_accessibility_focused
android:drawable
当前控件指定drawable资源id
selector作为drawable使用时,放在res/drawable,item必须指定android:drawable属性,selector作为color使用时,则放在res/color目录下,item必须指定android:color属性。
View定义了四种不同的状态
(2)一个窗口只能有一个视图获得焦点(focus),而一个窗口可以有多个视图处于”selected”状态中。
总结:
focused状态一般是由按键操作引起的;
pressed状态是由触摸消息引起的;
selected则完全是由应用程序主动调用setSelected()进行控制。
例如:当我们触摸某个控件时,会导致pressed状态改变;获得焦点时,会导致focus状态变化。于是,我们可以通过这种更新后状态值去更新我们对应的Drawable对象了。
注:
(1)每当状态发生改变时,系统会在state list中从上到下遍历寻找与之相匹配的状态。这里在遍历时只会取去当前状态相匹配的第一个Item,而不是最匹配的那一个。
(2)TextView在使用选择器时需要注册点击事件,不然不会触发选择器,具体原因也不清楚
(3)android:color这个属性来设置不同状态下的颜色,但是如果是设置图片就必须使用android:drawable属性,不然就会报错。
(4)在读取状态时,只会读取符合当前View状态的第一个Item的内容。如果selector的第一个item中没有标注任何一个状态,那么它表示使用任何状态,将会在View每次状态变化时只读取这个item的内容。所以,这样的默认的配置,一般都会置于最下面的item中。