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 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實現持久切換。