如题,主要是安卓selector的使用及注意事项
一、selector的创建
我是使用安卓studio 版本:3.1.4,项目树切换到Android视图,在目录App->new-> Android Resource File
方式2: res->new-> Android Resource File
方式3:drawable->new-> Drawable Resource File
Directory name选择drawable,填写一个文件名,生成文件内容如下:
推荐第三种方式,比较方便一些。
二、selector写法
常用样式
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 非触摸模式(有焦点有点击)按下的时候 -->
<item android:state_focused="true" android:state_pressed="true">
<!-- 触摸模式(无焦点有点击)按下的时候 -->
<item android:state_focused="false" android:state_pressed="true">
<!-- 有焦点的时候 -->
<item android:state_focused="true">
<!-- 无焦点的时候 -->
<item android:state_focused="false">
<!-- selected状态选中的时候 -->
<item android:state_selected="true">
<!-- checked状态选中的时候 -->
<item android:state_checked="true">
</selector>
三、使用注意事项
1. selector中item的顺序执行问题:
selector中的item的状态判断是由上而下进行判断的,一旦匹配到该状态,那么之后的状态就不再进行匹配。
比如下边代码:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/btn_unenable" android:state_enabled="false" />
<item android:drawable="@color/colorPrimary" android:state_pressed="false" />
<item android:drawable="@color/colorPrimaryDark" android:state_pressed="true" />
</selector>
分析:共有三种状态:不可用、按下、未按下,此时三种状态都可以正常运作。如果调整顺序如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/colorPrimary" android:state_pressed="false" />
<item android:drawable="@color/colorPrimaryDark" android:state_pressed="true" />
<item android:drawable="@color/btn_unenable" android:state_enabled="false" />
</selector>
会发现:不可用状态会匹配不到,因为会先匹配到 未按下状态,之后就不再进行匹配了。
解决方式:
* 将两者互有包含的状态进行详细的区分,做到互不包含;
* 将更加具体的状态顺序调整到不够具体状态的上面;
2. selector完全不起作用:
可能view设置了不可见状态或者不可使用状态(android:enabled="false",或者使用android:clickable="false")
可能是对view.setOnTouchListener(),返回值是true的时候。
说明:selector生效的前提是当前控件是clickable="true",安卓中有些控件是默认可点击的,但是有些不是,比如ViewGroup这些
,如果一个控件设置了onClickListener,那么该控件将默认设置为clickable="true"。view.setOnTouchListener(),返回值是true时,
该view的onClick事件将无法接收到,即clickable="false"
3. selector与图片名重名,那么默认将调用图片。