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

Android TextView 點擊切換背景色:Selector 還原機制與代碼實現

     編輯:程式設計綜合問答

Selector 為何會還原

state_pressed 僅在**手指按下期間**為 true,抬起瞬間變 false → Selector 匹配下一條 state_focused 或默認項 → 背景恢復。

正確做法:代碼控制狀態


// 1. 定義兩個 Drawable (XML 或代碼)
Drawable bgNormal = ContextCompat.getDrawable(this, R.drawable.circle_off);
Drawable bgSelected = ContextCompat.getDrawable(this, R.drawable.circle_on);

// 2. TextView 設置點擊監聽
textView.setOnClickListener(v -> {
    boolean selected = !textView.isSelected(); // 利用 isSelected 狀態
    textView.setSelected(selected);
    textView.setBackground(selected ? bgSelected : bgNormal);
});

// 3. XML 只需設置初始背景
<TextView
    android:id="@+id/tv"
    android:background="@drawable/circle_off"
    android:clickable="true"
    android:focusable="true" />

若堅持用 Selector 實現切換


<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/circle_on" android:state_selected="true" />
    <item android:drawable="@drawable/circle_off" />
</selector>

// 代碼只需切換 selected 狀態
textView.setOnClickListener(v -> textView.setSelected(!textView.isSelected()));
// 背景自動由 Selector 根據 state_selected 切換

方案對比

方案優點缺點
代碼 setBackground邏輯直觀、可插入動畫、支持複雜狀態機需手動管理 Drawable 引用
Selector + state_selected聲明式、自動適用狀態變化、代碼極少動畫定制受限
ToggleButton / Switch原生雙狀態控件、無需自寫邏輯樣式定制麻煩

**Selector 只響應「當前觸摸/焦點」等瞬態狀態**,不保持「選中/未選中」業務狀態。業務切換請用 state_selected + setSelected() 或純代碼控制,切勿試圖用 state_pressed 實現持久切換。

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