博客 / 詳情

返回

Android 彈出進度條對話框 避免用户點擊界面交互

下面給出最常用、最簡潔的 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(通用,不廢棄)

  1. 先寫個極簡佈局 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>
  1. 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();
    }
}
  1. 在 Activity / Fragment 中使用:
LoadingDialog loading = new LoadingDialog(this);   // this = Activity
loading.show();
// ...耗時操作...
loading.dismiss();

三、幾點注意

  1. 兩種寫法都 必須在主線程(UI 線程)中 show()/dismiss()
  2. 如果放在 AsyncTask/Thread 裏,用 runOnUiThread()Handler(Looper.getMainLooper())
  3. 若使用 DialogFragment 同理,只要 setCancelable(false) 即可。
  4. Android O 以後官方推薦用 ProgressBar + Dialog/DialogFragmentProgressDialog 雖仍能用,但隨時可能被徹底移除,建議新項目用第二種方案。

複製即可運行,屏蔽一切用户點擊事件。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.