在Android中,我们需要实现一个View的点击或选中样式的改变,大多数情况下我们都是使用drawable文件,也就是selector,shape等组成的资源文件。大致套路如下的常规写法:

常规写法

比如新建一个正常状态下的shape文件sp_normal.xml,选中状态的sp_checked.xml,组合两个shape的sr_default.xml

<?xml version="1.0" encoding="utf-8"?>
<!--sp_normal.xml-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="@android:color/black" /><corners android:radius="4dp" />
</shape>
复制代码
<?xml version="1.0" encoding="utf-8"?>
<!--sp_checked.xml-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="@android:color/holo_red_light" /><corners android:radius="4dp" />
</shape>
复制代码
<?xml version="1.0" encoding="utf-8"?>
<!--sr_default.xml-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/sp_normal" android:state_checked="false" /><item android:drawable="@drawable/sp_checked" android:state_checked="true" />
</selector>
复制代码

然后将sr_default.xml设置给View的background

<CheckedTextViewandroid:id="@+id/tv_normal_n"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="44dp"android:background="@drawable/sr_default"android:checked="false"android:padding="10dp"android:text="普通的 checked == false"android:textColor="@android:color/white"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><CheckedTextViewandroid:id="@+id/tv_normal_c"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="24dp"android:background="@drawable/sr_default"android:checked="true"android:padding="10dp"android:text="普通的 checked == true"android:textColor="@android:color/white"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/tv_normal_n" />
复制代码

显示效果如下:

下面我们来看看怎么简写这个样式。

简易写法

我们只需要新建一个sr_simplify.xml文件,父标签是selector,子shape标签用item标签包裹。

<?xml version="1.0" encoding="utf-8"?>
<!--sr_simplify.xml-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="false"><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="@android:color/black" /><corners android:radius="4dp" /></shape></item><item android:state_checked="true"><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="@android:color/holo_red_light" /><corners android:radius="4dp" /></shape></item></selector>
复制代码

布局跟上面布局差不多,直接看显示效果:

总结

我们实践发现两种写法都可以实现同样的需求,但是具体要使用哪种可以依据自己的实际情况来抉择。

  • 方式一可以实现更好的解耦,shape文件也可以复用
  • 方式二写起来更加简单,也减少了样式文件

源码地址:https://github.com/simplepeng/AndroidExamples/tree/master/example_simplify_selector

Android Selector的简写相关推荐

  1. android 动态修改 selector,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

  2. Android Selector 用法

    此贴为转载 ,不是本人制作. Android中的Selector主要是用来改变ListView和Button控件的默认背景.其使用方法可以按一下步骤来设计:(以在mylist_view.xml为例) ...

  3. android selector点击修改颜色,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

  4. Android selector 使用注意.

    下面是几个是实现的效果 效果图demo 地址 selector 的作用: selector 是选择,用来修改修改控件的背景,设置点击效果,等, 自己一般使用在点击之后改变控件的背景色以及文字的颜色,比 ...

  5. android selector的用法解析

    Selector 的英文是选择器,挑战者 android中主要是背景选择器 selector 是在drawable/xxx.xml中配置的 相关属性: android:state_selected是选 ...

  6. [转]android selector 背景选择器

    关于listview和button都要改变android原来控件的背景,在网上查找了一些资料不是 很全,所以现在总结一下android的selector的用法. 首先android的selector是 ...

  7. android selector下的设置背景属性值

    在res/drawable文件夹新增一个文件,此文件设置了图片的触发状态,你可以设置 state_pressed,state_checked,state_pressed,state_selected, ...

  8. Android selector 使用

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="ht ...

  9. Android selector

    以前知道selector可以设置图片选择没有选择,不知道文字也可以.最近做项目,看到那个文字,点击一个颜色,不点击一个颜色.才知道原来文字也可以selector. 使用如下: <TextView ...

最新文章

  1. ig服务器维护,IG夺冠遭无视后,LOL官方公开道歉:对不起,都是服务器的问题!...
  2. AgilePoint模型驱动BPM(业务流程管理)介绍
  3. centos llvm安装_在CentOS上编译安装llvm-3.8.1详细教程
  4. VTK:PolyData之ThinPlateSplineTransform
  5. 在c语言中如何屏蔽一段程序,如何在用C语言关闭TCP程序中的Nagle算法
  6. ftp服务器需要什么系统,ftp服务器需要什么系统
  7. oracle开归档服务器,ORACLE RAC 启用归档
  8. Consul在.Net Core中初体验
  9. wordpress mysql缓存_WordPress 对象缓存与数据库缓存
  10. kali数据库渗透_Kali Linux渗透测试实战 1.4 小试牛刀
  11. 显示js对象所有属性和方法的函数
  12. eclipse下载支持compiler compliance level 1.8的插件
  13. Landsat卫星MSS/TM/ETM数据(转自ESRI社区)(二)
  14. PTB-XL心电信号处理
  15. scroll案例:带有动画的返回顶部
  16. android换肤的实现方案,Android 换肤的思路
  17. C# 实现解答数独功能
  18. java中竖线怎么画_java split | (竖线)
  19. 温暖(warmth)
  20. 最新Python 实现自动登录抖音(京东),实现滑块自动滑过

热门文章

  1. mantis1.18升级1.2X方法
  2. WCF热带鱼书学习手记 - Service Contract Overload
  3. android kotlin面试题,Kotlin面试25题
  4. 科研SCI论文图片常见问题和错误汇总
  5. Mybatis报错ClassNotfind
  6. vsprintf用法解析
  7. colab出现input output error问题
  8. 光流 | 光流算法对比:Farneback、Horn-Schunck、Lucas-Kanade、Lucas-Kanade derivative of Gaussian(附Matlab与C++代码)
  9. SLAM | 三维重建方法之KinectFusion与ElasticFusion详解
  10. tiny cc在云服务centos上运行