首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Android 弹出进度条对话框 避免用户点击界面交互

Android 弹出进度条对话框 避免用户点击界面交互

原创
作者头像
lichong951
修改2025-12-03 14:48:27
修改2025-12-03 14:48:27
1930
举报

下面给出最常用、最简洁的 Java 实现方式:

ProgressDialog(已废弃但仍可用)和 ProgressBar + 透明不可取消 Dialog(推荐,兼容性好,可定制)。

两种写法都 强制屏蔽用户点击(setCancelable(false) + setCanceledOnTouchOutside(false)),避免界面交互。


一、ProgressDialog(一行代码即可,已废弃但简单)

代码语言:java
复制
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
复制
<?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 代码:
代码语言: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 中使用:
代码语言:java
复制
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 虽仍能用,但随时可能被彻底移除,建议新项目用第二种方案。

复制即可运行,屏蔽一切用户点击事件。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档