安卓Selector选择器使用与避坑总结

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

###Selector使用与避坑总结

###selector文件item节点下android:state_XXXX属性坑

人生苦短,及时避坑。

之前遇到了明明selector选择器android:state_XXXX属性与java代码中状态改变一致,却就是不生效的坑。
浪费了几个小时的时间,终于将这个原因排查出来了。

顺序顺序顺序!!
重要的事情说三遍,一定要注意item各个状态的顺序问题!
例如:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="@color/gray_CCCCCC" />
        </shape>
    </item>
    <item android:state_enabled="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorTheme" />
        </shape>
    </item>
</selector>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
 	<item android:state_enabled="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorTheme" />
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="@color/gray_CCCCCC" />
        </shape>
    </item>
</selector>

是不一样的,item的state顺序很重要,否则代码中改变View状态Selector是不会有动作的,这一块可能是一个官方的一个坑吧,以后再看源码分析原因。

目前的使用一定要注意:后写View默认状态

拿上面的state_enable属性举例,View默认状态enable的状态是true,如果把item的enable_state=true属性先写(第二段代码那样),那么在java代码中动态设置view.Enabled = true或false都是无法生效的。

正确写法一定要把View默认状态对应的state写在最后(第一段代码)

###举个例子
例如:项目中有一种常用效果,如果按钮可以点击,则高亮按钮。如果不可点击,则将按钮置灰。
用selector文件可以很简单的实现。

  • 首先在drawable文件下新建selector文件:

    这个文件即表示enable为true(可点击)时,颜色为鲜绿色。如果enable为false(不可点击时),颜色为灰色。

    **注意:**android:state_enabled="false"属性的item节点放到最后,否则无效果。这也是这篇文章存在的理由,顺序很重要。

  • 接下来将selector应用到按钮背景色中。在Android Studio中可以实时预览selector效果。

  • 最后在java代码中修改View的可选中状态。

    • mSelectedV2Binding.btnSure.setEnabled(true);
    • mSelectedV2Binding.btnSure.setEnabled(false);

    运行测试没问题,避坑完毕。

Enabled与setClickable的区别,请参考传送门

  • 列举一些默认状态:
    • state_enabled默认为true,所以android:state_enabled="true"需要最后写。
    • state_selected默认为false,android:state_enabled="false"顺序放到最后。
    • state_pressed默认为false,android:state_pressed="false"书写顺序最后写。

###渐变
shape中提供了gradient节点,可以用来实现一个渐变的效果;

上代码:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:angle="0"
        android:endColor="@color/tran_00f1f1f1"
        android:startColor="@color/tran_f4f4f4"
        android:type="linear" />

</shape>

这段代码就实现了一个渐变效果的矩形,配合selector用在按钮上,就可以满足很多日常所需了。

  • angle:角度,水平为0.
  • endColor:结束颜色
  • startColor:开始颜色
  • type:渐变类型
    • linear 线性渐变
    • sweep 扫描渐变
    • radial 辐射渐变,中心向周围辐射状的渐变。

效果图:

猜你喜欢

转载自blog.csdn.net/weixin_39397471/article/details/85007857
今日推荐