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

Android 靜態 Context 中啟用 ActionBar 進度條

     編輯:程式設計綜合問答

問題現象

在非 Activity 類別(如工具類、靜態方法)中持有 Context mContext,嘗試呼叫 setSupportProgressBarIndeterminateVisibility(true) 時,編譯錯誤:method is undefined for the type Activity。

原因分析

  • setSupportProgressBarIndeterminateVisibility 是 AppCompatActivity(或 ActionBarActivity 舊版)的方法,而非基礎 Activity 類別擁有。
  • 若 mContext 實際指向的物件是 AppCompatActivity 子類,需強制轉型為該具體子類型,而非轉為 Activity。

解決方案

方案一:強制轉型為具體 Activity 子類(快速修復)

// 假設實際 Activity 類別名為 MyActivity
((MyActivity) mContext).setSupportProgressBarIndeterminateVisibility(true);

⚠️ 缺點:產生緊耦合,工具類只能在特定 Activity 使用。

方案二:定義介面回呼(推薦,解耦)

// 1. 定義介面
public interface ProgressIndicator {
    void showIndeterminateProgress(boolean show);
}

// 2. Activity 實作介面
public class MyActivity extends AppCompatActivity implements ProgressIndicator {
    @Override
    public void showIndeterminateProgress(boolean show) {
        setSupportProgressBarIndeterminateVisibility(show);
    }
}

// 3. 工具類持有介面引用
public class NetworkHelper {
    private ProgressIndicator mProgressCallback;

    public NetworkHelper(ProgressIndicator callback) {
        mProgressCallback = callback;
    }

    public void fetchData() {
        mProgressCallback.showIndeterminateProgress(true);
        // ... 執行網路請求 ...
        mProgressCallback.showIndeterminateProgress(false);
    }
}

// 4. Activity 中建立 Helper
NetworkHelper helper = new NetworkHelper(this); // this 實作了 ProgressIndicator

方案三:使用現代替代方案(Toolbar + ProgressBar)

自 Android 5.0 起,ActionBar 進度條已棄用。建議在佈局中放置 Toolbar 與 ProgressBar,由 View 控制顯隱:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize" />

<ProgressBar
    android:id="@+id/progress_bar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:indeterminate="true"
    android:visibility="gone" />
// Activity 或 Fragment 中
ProgressBar progressBar = findViewById(R.id.progress_bar);
progressBar.setVisibility(View.VISIBLE); // 顯示
progressBar.setVisibility(View.GONE);    // 隱藏

總結

若維護舊專案必須用 setSupportProgressBarIndeterminateVisibility,請採用「方案二」介面回呼避免耦合;新專案請直接改用 Toolbar + ProgressBar 組合,符合 Material Design 規範且支援完整自訂樣式。

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