其實(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