Android 代碼動態(tài)設置TextView的背景、顏色Selector

在Android里面拂铡,實現(xiàn)TextView等根據(jù)不同狀態(tài)顯示不同的背景和顏色是很簡單滴壹无,只需要設置對應的selector就好了!
背景選擇器(res/drawable):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:drawable/ic_delete" android:state_checked="true"/>
    <item android:drawable="@android:drawable/ic_input_add"/>
</selector>

顏色選擇器(res/color):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="#ff0000" />
    <item android:state_focused="true" android:color="#ff0000" />
    <item android:state_pressed="true" android:color="#ff0000" />
    <item android:color="#89683B" />
</selector>

那么我們需要動態(tài)設置這些東西怎么寫呢和媳?這里就有兩個類了:StateListDrawable,ColorStateList看這個名字就知道這兩個類是來干嘛的了格遭!

首先說下StateListDrawable
創(chuàng)建對應的StateListDrawable,通過addState (int[] stateSet, Drawable drawable)的方法添加我們指定的一些狀態(tài)哈街,可以看到第一個參數(shù)是一個數(shù)組留瞳,后面就是對應的Drawable。那么問題來了骚秦,一個狀態(tài)的true或者false是怎么指定的呢她倘?答案就是下面這個樣子滴:

    StateListDrawable states = new StateListDrawable();
    states.addState(new int[]{-android.R.attr.state_checked}, getDrawable(android.R.drawable.ic_media_play));
    states.addState(new int[]{android.R.attr.state_checked}, getDrawable(android.R.drawable.ic_delete));
    return states;

前面有一個負號就是false的狀態(tài)!

然后就是ColorStateList了作箍,它的構造方法public ColorStateList(int[][] states, @ColorInt int[] colors),看著是不是有點兒膩害硬梁,顏色狀態(tài)居然指定的是一個二維的數(shù)組,剛剛上面不是都才指定一個一維的數(shù)組嘛胞得,為什么這里就是一個二維的呢荧止?第二個參數(shù)也是一個color的數(shù)組。

其實可以這樣理解阶剑,就是把上面說的一個狀態(tài)和一個color又分別裝到了一個數(shù)組中了跃巡,所以維度都對應增加了1,這樣我們就不用去添加好幾次了牧愁,注意上面的寫法素邪,每一種狀態(tài)我們都需要添加一次的!猪半!

那么套路明確了之后就可以把上面的寫法改造一下兔朦,比如說第一個參數(shù)一個二維數(shù)組:

    int[][] states = new int[][]{
            new int[]{-android.R.attr.state_checked}, // unchecked
            new int[]{android.R.attr.state_checked}  // checked
    };//把兩種狀態(tài)一次性添加

第二個參數(shù)每個狀態(tài)對應的顏色:

    int[] colors = new int[]{
            Color.RED,
            Color.GREEN
    };//把兩種顏色一次性添加

最后再調用構造方法就好啦!磨确!

ColorStateList colorStateList = new ColorStateList(states, colors);

最后沽甥,再說說給TextView及它的小弟動態(tài)設置CompoundDrawable的問題,這個就是在xml中設置的那個drawableTop乏奥、drawableBottom安接、等等!

這里需要注意一個問題,就是我們代碼new出來的Drawable的Bound是沒有指定好的盏檐,那么導致的問題就是它可能根本就不會繪制的P健!

setCompoundDrawables.png

解決辦法就是你可以直接調用setCompoundDrawablesRelativeWithIntrinsicBounds()這個老長老長的方法讓系統(tǒng)自動去設置那個Bound的參數(shù)胡野!

@android.view.RemotableViewMethod
public void setCompoundDrawablesRelativeWithIntrinsicBounds(@Nullable Drawable start,
        @Nullable Drawable top, @Nullable Drawable end, @Nullable Drawable bottom) {

    if (start != null) {
        start.setBounds(0, 0, start.getIntrinsicWidth(), start.getIntrinsicHeight());
    }
    if (end != null) {
        end.setBounds(0, 0, end.getIntrinsicWidth(), end.getIntrinsicHeight());
    }
    if (top != null) {
        top.setBounds(0, 0, top.getIntrinsicWidth(), top.getIntrinsicHeight());
    }
    if (bottom != null) {
        bottom.setBounds(0, 0, bottom.getIntrinsicWidth(), bottom.getIntrinsicHeight());
    }
    setCompoundDrawablesRelative(start, top, end, bottom);
}

當然你也可以老老實實在創(chuàng)建StateListDrawable的時候手動調用一下setBound()的方法啦2氖А!

到此結束A蚨埂龙巨!希望大家不要再掉到對應的坑里面了!熊响!

---- Edit By Joe ----

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末旨别,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子汗茄,更是在濱河造成了極大的恐慌秸弛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洪碳,死亡現(xiàn)場離奇詭異递览,居然都是意外死亡,警方通過查閱死者的電腦和手機瞳腌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門绞铃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嫂侍,你說我怎么就攤上這事儿捧。” “怎么了挑宠?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵菲盾,是天一觀的道長。 經(jīng)常有香客問我痹栖,道長亿汞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任揪阿,我火速辦了婚禮疗我,結果婚禮上,老公的妹妹穿的比我還像新娘南捂。我一直安慰自己吴裤,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布溺健。 她就那樣靜靜地躺著麦牺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剖膳,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天魏颓,我揣著相機與錄音,去河邊找鬼吱晒。 笑死甸饱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的仑濒。 我是一名探鬼主播叹话,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼墩瞳!你這毒婦竟也來了驼壶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤喉酌,失蹤者是張志新(化名)和其女友劉穎热凹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞭吃,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡碌嘀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年涣旨,在試婚紗的時候發(fā)現(xiàn)自己被綠了歪架。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡霹陡,死狀恐怖和蚪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情烹棉,我是刑警寧澤攒霹,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站浆洗,受9級特大地震影響催束,放射性物質發(fā)生泄漏。R本人自食惡果不足惜伏社,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一抠刺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摘昌,春花似錦速妖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春锦秒,著一層夾襖步出監(jiān)牢的瞬間露泊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工旅择, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滤淳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓砌左,卻偏偏與公主長得像脖咐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汇歹,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程屁擅,因...
    小菜c閱讀 6,365評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,744評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)产弹,斷路器派歌,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 更多Android總結知識點 Android中的13種Drawable小結 Android的八種對話框的實現(xiàn) An...
    侯蛋蛋_閱讀 3,946評論 0 5
  • 很久以后,每當小寶路過車站痰哨,總是摸摸自己虎虎的小腦袋胶果,粗粗的眉毛擰在一起,小眼睛里滿是希冀斤斧,順著長長的鐵軌望去早抠,他...
    梁道秋閱讀 264評論 0 1