在非 Activity 類別(如工具類、靜態方法)中持有 Context mContext,嘗試呼叫 setSupportProgressBarIndeterminateVisibility(true) 時,編譯錯誤:method is undefined for the type Activity。
setSupportProgressBarIndeterminateVisibility 是 AppCompatActivity(或 ActionBarActivity 舊版)的方法,而非基礎 Activity 類別擁有。mContext 實際指向的物件是 AppCompatActivity 子類,需強制轉型為該具體子類型,而非轉為 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
自 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 規範且支援完整自訂樣式。