如何為控件動(dòng)態(tài)設(shè)置ColorSelector

其實(shí)一開始,在簡書上寫東西我是拒絕的栖疑!怕被拍磚讨永,后來發(fā)現(xiàn)鄰桌的郭老師時(shí)不時(shí)寫寫簡書,我才意識(shí)到遇革,原來什么樣的人都可以寫簡書卿闹,充分說明簡書的讀者還是很包容的。膽戰(zhàn)心驚萝快,寫下第一篇簡書比原,主要是為了和大家共同分享記錄開發(fā)中的點(diǎn)點(diǎn)滴滴(好吧,其實(shí)我是記性差杠巡,想寫寫筆記量窘,但是字太丑,紙質(zhì)的寫完沒幾天自己都不認(rèn)識(shí)了G庥怠)

今天要分享的內(nèi)容不多蚌铜,主要是和大家分享一下如何在代碼中動(dòng)態(tài)設(shè)置ColorSelector,作為一名開發(fā)人員嫩海,在XML中無論是配置background的selector還是color的selector冬殃,都應(yīng)該是我們的基本功。XML中控件的屬性一般也都對應(yīng)動(dòng)態(tài)的方法叁怪,eg: android:text="R.string.register"對應(yīng)著setText()方法审葬,這樣的對應(yīng)有很多。廢話不多說奕谭,說問題涣觉,上代碼。

使用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" />```
可以看到血柳,這是個(gè)RadioButton控件(廢話)官册,是使用了兩個(gè)selector,在XML中使用selector的時(shí)候难捌,只要selector不寫錯(cuò)膝宁,肯定沒有問題。但是根吁,測試妹子提了個(gè)要求员淫,為了實(shí)現(xiàn)這個(gè)需求,需要?jiǎng)討B(tài)給控件設(shè)置selector击敌,我們知道介返,background在代碼中設(shè)置selector是沒有問題的,但是textColor呢愚争?我也沒試過映皆,于是我就慣性思維的調(diào)了個(gè)setTextColor(int color)的方法挤聘,參數(shù)直接為selector轰枝,結(jié)果可想而知捅彻,是失敗的,要不我還來廢話干啥鞍陨?發(fā)現(xiàn)當(dāng)某個(gè)RadioBUtton的textSelector不起作用步淹,剛開始,我也很納悶诚撵,但是發(fā)現(xiàn)了個(gè)setTextColor(ColorStateList colors)缭裆,這是個(gè)什么?當(dāng)然是顏色集合啦寿烟,那么這兩個(gè)重載方法有什么區(qū)別呢澈驼?為了寫好這篇帖子,硬著頭皮去讀源碼(讀源碼就想吐筛武,有高手請指教)缝其。
源碼如下:

/**

  • 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();
    }
可以看到兩個(gè)重載方法的內(nèi)部最終都是把傳進(jìn)的參數(shù)轉(zhuǎn)成了ColorStateList集合,那為什么我用第一種重載不行呢徘六?當(dāng)我把第一種方法valueof()方法的源碼點(diǎn)下去内边,發(fā)現(xiàn):

/**
**@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;
}
}```
看到,注釋中說的很清楚了待锈,調(diào)用該方法返回的集合只包含一種顏色漠其,這也就解釋了為什么我的textSelector使用這個(gè)方法的時(shí)候不奏效了!就算你selector中的item寫得再多竿音,雖然它也是把咱們的selector最終轉(zhuǎn)化為ColorStateList 來設(shè)置字體顏色和屎,但是setTextColor(@ColorInt int color) 只返回第一種顏色!我們可以通過context.getResources().getColorStateList(R.color.selector名)來獲取ColorStateList 對象作為參數(shù)傳進(jìn)我們的setTextColor(ColorStateList colors)方法中春瞬!

最后眶俩,剛下筆寫簡書的時(shí)候郭老師告訴我寫著太麻煩,我不信快鱼,寫了下來發(fā)現(xiàn)確實(shí)不太方便颠印,尤其是代碼格式化,是我一個(gè)一個(gè)回車敲出來的(可能我太low了)抹竹!希望大家給予支持线罕!如果大家有好的稿件或資源,也麻煩大家動(dòng)動(dòng)你的小手指分享出來呦窃判!附上我的郵箱:huangpenfy@163.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞楼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子袄琳,更是在濱河造成了極大的恐慌询件,老刑警劉巖燃乍,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宛琅,居然都是意外死亡刻蟹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門嘿辟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舆瘪,“玉大人,你說我怎么就攤上這事红伦∮⒐牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵昙读,是天一觀的道長召调。 經(jīng)常有香客問我,道長蛮浑,這世上最難降的妖魔是什么唠叛? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮陵吸,結(jié)果婚禮上玻墅,老公的妹妹穿的比我還像新娘。我一直安慰自己壮虫,他們只是感情好澳厢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囚似,像睡著了一般剩拢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饶唤,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天徐伐,我揣著相機(jī)與錄音,去河邊找鬼募狂。 笑死办素,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祸穷。 我是一名探鬼主播性穿,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雷滚!你這毒婦竟也來了需曾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呆万,沒想到半個(gè)月后商源,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谋减,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年牡彻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃顶。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讨便,死狀恐怖充甚,靈堂內(nèi)的尸體忽然破棺而出以政,到底是詐尸還是另有隱情,我是刑警寧澤伴找,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布盈蛮,位于F島的核電站,受9級特大地震影響技矮,放射性物質(zhì)發(fā)生泄漏抖誉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一衰倦、第九天 我趴在偏房一處隱蔽的房頂上張望袒炉。 院中可真熱鬧,春花似錦樊零、人聲如沸我磁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夺艰。三九已至,卻和暖如春沉衣,著一層夾襖步出監(jiān)牢的瞬間郁副,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工豌习, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留存谎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓肥隆,卻偏偏與公主長得像既荚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子巷屿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容