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 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)。