首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android TextView 恢復 Selector 背景:setBackgroundColor 後正確重設 StateListDrawable

     編輯:程式設計疑難解答

問題

TextView 原本設定 android:background="@drawable/btn_selector" (StateListDrawable),點擊變色、放開還原。後因需求呼叫 setBackgroundColor(Color.GRAY) 置灰,之後欲恢復 Selector 效果,setBackgroundColor(R.drawable.btn_selector) 報錯(參數型別不符)。

正確恢復代碼

// 方法一:Resources.getDrawable (API 21+ 建議用主題版本)
textView.setBackground(ContextCompat.getDrawable(context, R.drawable.btn_selector));

// 方法二:Resources.getDrawable (舊 API)
textView.setBackground(getResources().getDrawable(R.drawable.btn_selector));

// 方法三:保存原始 Drawable 參考(效能最好)
// 初始化時保存
private Drawable originalBackground;
@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    originalBackground = textView.getBackground(); // 取得 StateListDrawable
}

// 置灰時
textView.setBackgroundColor(Color.GRAY);

// 恢復時
textView.setBackground(originalBackground);

關鍵點

  • setBackgroundColor(int color) 參數是**顏色整數**(如 0xFFCCCCCC),而非資源 ID。
  • setBackground(Drawable d) / setBackgroundResource(int resId) 才接受 Drawable/資源 ID。
  • ContextCompat.getDrawable() 會正確處理主題屬性與版本差異。
  • 保存原始 Drawable 參考可避免重複解析 XML,且能保留原始狀態(如按下態)。

Selector XML 範例 (btn_selector.xml)

<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/colorPrimaryDark" />
    <item android:state_focused="true" android:drawable="@color/colorAccent" />
    <item android:drawable="@color/colorPrimary" /> <!-- default -->
</selector>

總結

呼叫 setBackgroundColor() 後恢復 Selector,請用 setBackground(ContextCompat.getDrawable(...)) 或預先保存 getBackground() 回傳的 Drawable 直接 setBackground(savedDrawable)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved