安卓selector使用及注意事项

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/alex01550/article/details/82593115

如题,主要是安卓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与图片名重名,那么默认将调用图片。

猜你喜欢

转载自blog.csdn.net/alex01550/article/details/82593115