如何为控件动态设置ColorSelector

其实一开始,在简书上写东西我是拒绝的!怕被拍砖,后来发现邻桌的郭老师时不时写写简书,我才意识到,原来什么样的人都可以写简书,充分说明简书的读者还是很包容的。胆战心惊,写下第一篇简书,主要是为了和大家共同分享记录开发中的点点滴滴(好吧,其实我是记性差,想写写笔记,但是字太丑,纸质的写完没几天自己都不认识了!)

今天要分享的内容不多,主要是和大家分享一下如何在代码中动态设置ColorSelector,作为一名开发人员,在XML中无论是配置background的selector还是color的selector,都应该是我们的基本功。XML中控件的属性一般也都对应动态的方法,eg: android:text="R.string.register"对应着setText()方法,这样的对应有很多。废话不多说,说问题,上代码。

使用selctort的控件:

<RadioButton   
  android:layout_width="wrap_content"    
  android:layout_height="wrap_content"    
  android:background="@drawable/selector_choose_grade_bg"  
  android:button="@null"  
  android:padding="2dp"   
  android:gravity="center"   
  android:text="1年级"  
  android:textColor="@color/selector_grade_color" />```
可以看到,这是个RadioButton控件(废话),是使用了两个selector,在XML中使用selector的时候,只要selector不写错,肯定没有问题。但是,测试妹子提了个要求,为了实现这个需求,需要动态给控件设置selector,我们知道,background在代码中设置selector是没有问题的,但是textColor呢?我也没试过,于是我就惯性思维的调了个setTextColor(int color)的方法,参数直接为selector,结果可想而知,是失败的,要不我还来废话干啥?发现当某个RadioBUtton的textSelector不起作用,刚开始,我也很纳闷,但是发现了个setTextColor(ColorStateList colors),这是个什么?当然是颜色集合啦,那么这两个重载方法有什么区别呢?为了写好这篇帖子,硬着头皮去读源码(读源码就想吐,有高手请指教)。
源码如下:

/**

  • Sets the text color for all the states (normal, selected, * focused) to be this color.
  • @see #setTextColor(ColorStateList)
  • @see #getTextColors()
  • @attr ref android.R.styleable#TextView_textColor
    /
    @android.view.RemotableViewMethod
    public void setTextColor(@ColorInt int color) {
    mTextColor = ColorStateList.valueOf(color);
    updateTextColors();}
    /
    * * Sets the text color.
  • @see #setTextColor(int)
  • @see #getTextColors()
  • @see #setHintTextColor(ColorStateList)
  • @see #setLinkTextColor(ColorStateList)
  • @attr ref android.R.styleable#TextView_textColor
    */
    public void setTextColor(ColorStateList colors) {
    if (colors == null) {
    throw new NullPointerException();
    }
    mTextColor = colors;
    updateTextColors();
    }
可以看到两个重载方法的内部最终都是把传进的参数转成了ColorStateList集合,那为什么我用第一种重载不行呢?当我把第一种方法valueof()方法的源码点下去,发现:

/**
**@return A ColorStateList containing a single color.
*/
@NonNull
public static ColorStateList valueOf(@ColorInt int color) {
synchronized (sCache) {
final int index = sCache.indexOfKey(color);
if (index >= 0) {
final ColorStateList cached = sCache.valueAt(index).get();
if (cached != null) {
return cached;
}
// Prune missing entry.
sCache.removeAt(index);
}
// Prune the cache before adding new items.
final int N = sCache.size();
for (int i = N - 1; i >= 0; i--) {
if (sCache.valueAt(i).get() == null) {
sCache.removeAt(i);
}
}
final ColorStateList csl = new ColorStateList(EMPTY, new int[] { color });
sCache.put(color, new WeakReference<>(csl));
return csl;
}
}```
看到,注释中说的很清楚了,调用该方法返回的集合只包含一种颜色,这也就解释了为什么我的textSelector使用这个方法的时候不奏效了!就算你selector中的item写得再多,虽然它也是把咱们的selector最终转化为ColorStateList 来设置字体颜色,但是setTextColor(@ColorInt int color) 只返回第一种颜色!我们可以通过context.getResources().getColorStateList(R.color.selector名)来获取ColorStateList 对象作为参数传进我们的setTextColor(ColorStateList colors)方法中!

最后,刚下笔写简书的时候郭老师告诉我写着太麻烦,我不信,写了下来发现确实不太方便,尤其是代码格式化,是我一个一个回车敲出来的(可能我太low了)!希望大家给予支持!如果大家有好的稿件或资源,也麻烦大家动动你的小手指分享出来呦!附上我的邮箱:huangpenfy@163.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,907评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,381评论 0 17
  • Linux基本命令学习 路径的切换运用cd命令对于工作目录进行切换,也可在命令后输入上级目录路径就可退出一层或多层...
    Tangjiayue92阅读 244评论 1 1
  • 当手指拨动起熟悉的旋律,时光能否沿着熟悉的旧址原路返回,那时走过的路又能否都留在弦上。 ...
    陶丽娅阅读 236评论 0 3