1. 程式人生 > >Android 程式碼裡動態設定TextView/Button等的文字顏色Seletor

Android 程式碼裡動態設定TextView/Button等的文字顏色Seletor

  • 前言
    今天遇到個很蛋疼的問題,下載時,多個按鈕共用一個button,也就是不同下載狀態下,button的背景以及字型顏色都不一樣,結果自己挖了坑把自己埋進去了。

以下是我在/res/color資料夾裡給button設定的文字顏色seletor:networkdata_btn_open_txtcolor_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color
="#ffffff" android:state_pressed="true">
</item> <item android:color="#ffffff" android:state_selected="true"></item> <item android:color="#f88b00"></item> </selector>
  • 坑?
    在程式碼裡設定顏色seletor,以為在程式碼裡直接呼叫 button.setTextColor(int colorValue) 就可以了,結果執行效果讓我傻眼了。

  • 怎麼挖坑的?

mBtnDownAndOpen.setText(DOWNLOAD_OPEN);  //設定button文字
             mBtnDownAndOpen.setTextColor(mContext.getResources().getColor(R.color.networkdata_btn_open_txtcolor_selector));    //設定button文字顏色
             mBtnDownAndOpen.setBackground(mContext.getResources().getDrawable(R.drawable.networkdata_btn_open_selector));    //設定button背景

鬱悶的是,只能讀取到沒獲取焦點時的色值,也就是 <item android:color="#f88b00"></item> ,其他狀態獲取不到。

  • 如何填坑?
    採用
    mBtnDownAndOpen.setTextColor(mContext.getResources().getColorStateList(R.color.networkdata_btn_open_txtcolor_selector)); 為button設定文字顏色。

區別在於:改之前用的是getColor,改之後用的是getColorStateList

  • WHY?
    文字顏色的seletor在程式碼裡的顯示形式是ColorStateList,而res/color放的就是ColorStateList資源XML檔案,getColor只能讀取單個的color。

淺薄理解,歡迎大家討論!