下面給出最常用、最簡潔的 Java 實現方式:
ProgressDialog(已廢棄但仍可用)和 ProgressBar + 透明不可取消 Dialog(推薦,兼容性好,可定製)。
兩種寫法都 強制屏蔽用户點擊(setCancelable(false) + setCanceledOnTouchOutside(false)),避免界面交互。
一、ProgressDialog(一行代碼即可,已廢棄但簡單)
private ProgressDialog progressDialog;
private void showLoading_PD() {
if (progressDialog == null) {
progressDialog = new ProgressDialog(this); // this = Activity
progressDialog.setMessage("加載中…");
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false); // 屏蔽返回鍵
progressDialog.setCanceledOnTouchOutside(false); // 屏蔽外部點擊
}
progressDialog.show();
}
private void dismissLoading_PD() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
二、官方推薦:自定義 Dialog(通用,不廢棄)
- 先寫個極簡佈局
dialog_loading.xml(放根目錄res/layout/):
<?xml version="1.0" encoding="utf-8"">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="24dp"
android:gravity="center_vertical">
<ProgressBar
android:layout_width="32dp"
android:layout_height="32dp"
android:indeterminate="true"/>
<TextView
android:id="@+id/tv_msg"
android:layout_marginStart="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加載中…"
android:textSize="16sp"/>
</LinearLayout>
- Java 代碼:
public class LoadingDialog {
private final Dialog dialog;
public LoadingDialog(@NonNull Activity activity) {
dialog = new Dialog(activity);
dialog.setContentView(R.layout.dialog_loading);
// 去掉標題
if (dialog.getWindow() != null) {
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
// 關鍵:禁止一切返回/觸摸取消
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
}
public void show() {
if (!dialog.isShowing()) dialog.show();
}
public void dismiss() {
if (dialog.isShowing()) dialog.dismiss();
}
}
- 在 Activity / Fragment 中使用:
LoadingDialog loading = new LoadingDialog(this); // this = Activity
loading.show();
// ...耗時操作...
loading.dismiss();
三、幾點注意
- 兩種寫法都 必須在主線程(UI 線程)中
show()/dismiss()。 - 如果放在
AsyncTask/Thread裏,用runOnUiThread()或Handler(Looper.getMainLooper())。 - 若使用
DialogFragment同理,只要setCancelable(false)即可。 - Android O 以後官方推薦用
ProgressBar+Dialog/DialogFragment,ProgressDialog雖仍能用,但隨時可能被徹底移除,建議新項目用第二種方案。
複製即可運行,屏蔽一切用户點擊事件。