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

Android ImageButton 狀態切換:用旗標而非檢視背景判斷

     編輯:程式設計綜合問答

問題

在 `if` 中判斷 `ImageButton` 當前背景以決定播放/暫停狀態,但 `getBackground()` 返回 `Drawable`,難以直接比較資源 ID。

正確模式:狀態旗標

**不要**檢視 UI 狀態,**要**維護邏輯狀態變數。

private boolean isPlaying = false; // 邏輯狀態

private void togglePlayPause() {
    if (isPlaying) {
        pause();
        isPlaying = false;
        button.setBackgroundResource(R.drawable.start_bg); // 顯示播放圖示
    } else {
        resume();
        isPlaying = true;
        button.setBackgroundResource(R.drawable.pause_bg); // 顯示暫停圖示
    }
}

// 綁定點擊
button.setOnClickListener(v -> togglePlayPause());

進階:使用 Selector 狀態列表 (XML)

定義 `res/drawable/btn_play_pause.xml`:

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

佈局中:

<ImageButton
    android:id="@+id/btnPlay"
    android:background="@drawable/btn_play_pause"
    android:clickable="true"
    android:focusable="true" />

程式碼:

ImageButton btn = findViewById(R.id.btnPlay);
btn.setOnClickListener(v -> {
    boolean playing = btn.isSelected();
    btn.setSelected(!playing); // 自動切換背景
    if (playing) pause(); else resume();
});

為何不檢視背景?

  • `getBackground()` 返回 `Drawable`,比較需 `getConstantState().equals()`,易出錯。
  • UI 狀態可能與邏輯不同步(如設定 `setBackgroundResource` 後未立即生效)。
  • 單一真實來源原則:邏輯狀態 (`boolean`/`enum`) 為主,UI 衍生更新。

結論

用 `boolean isPlaying` 或 `btn.setSelected()` 維護狀態,UI 依狀態渲染。Selector 讓 XML 宣告式管理狀態圖示,程式碼更簡潔健壯。

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