先说一下我的需求:6个按钮,默认是灰色,没有点击效果。在其他页面设置一些状态后,对应按钮高亮,并有点击效果。
添加点击效果,首先想到的就是selector,写一个xml,通过setBackground动态添加即可,可是字体颜色动态添加怎么做?
一、在res文件夹中建立color文件夹,在color文件中写一个selector用来添加点击效果。
例:新建seat_memory_font_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/ecarx_grey" android:state_pressed="true"/>
<item android:color="@color/common_white" android:state_pressed="false"/>
</selector>
二、在代码中添加,有两种方式
1.在xml布局中直接添加,如下:
android:textColor="@color/seat_memory_font_selector"
2.在java中动态添加(这个地方坑我一下午,此博客就为了纪念这个方法)
错误写法,此方法即使使用了selector,返回的也只是一种颜色,也不会有点击时改变字体颜色的效果
btn.setTextColor(getResources().getColor(R.color.seat_memory_font_selector));
正确写法,
btn.setTextColor(getResources().getColorStateList(R.color.seat_memory_font_selector));
getColorStateList查看源码,介绍如图:
大体意思就是:返回一个ColorStateList对象,该对象包含一个单色或多个颜色,这些颜色可以基于状态进行选择
背景和字体可以同时设置,即setBackground和setTextColor可以一起使用selector效果:
public void setBtnBg(Button btn){
btn.setBackground(getResources().getDrawable(R.drawable.seat_memory_selector));
btn.setTextColor(getResources().getColorStateList(R.color.seat_memory_font_selector));
}
三、整理了一些selector文件时常用的一些属性,这些属性可以理解为switch判断,当满足了一个条件后,就不会再向下执行了,所以在写selector时item顺序也很重要。
android:drawable 放一个drawable资源
android:color 放一个color资源
android:state_pressed 是否按下,如一个按钮触摸或者点击。
android:state_focused 是否取得焦点,比如用户选择了一个文本框。
android:state_hovered 光标是否悬停,通常与focused state相同,它是4.0的新特性
android:state_selected 被选中,它与focus state并不完全一样,如一个list view 被选中的时候,它里面的各个子组件可能通过方向键,被选中了。
android:state_checkable 组件是否能被check。如:RadioButton是可以被check的。
android:state_checked 被checked了,如:一个RadioButton可以被check了。
android:state_enabled 能够接受触摸或者点击事件
android:state_window_focused 应用程序是否在前台,当有通知栏被拉下来或者一个对话框弹出的时候应用程序就不在前台了
菜鸟踩坑,如有大神请指点!!!