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

下面给出最常用、最简洁的 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 虽仍能用,但随时可能被彻底移除,建议新项目用第二种方案。

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

相关推荐
朱容zr33313319 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
朝阳58120 小时前
Cesium `Camera.flyTo`:“飞过去“
javascript
知彼解己20 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse
NutShell Wang20 小时前
Vite 8.1 深度拆解:Rolldown 统一打包器如何终结前端构建的「双引擎时代」
前端·rust·开源·vite·开发者工具·vibe coding
朱容zr33313320 小时前
请解释“回表”的概念。
java·前端·数据库
不吃辣49020 小时前
vibe coding | 如何做一个 AI 音乐生成工具?
java·人工智能·后端·ai·ai编程
NWU_LK20 小时前
【WebFlux】第八篇 —— 自定义调度器
java
AI人工智能+电脑小能手20 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型
wuminyu20 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法
大黄说说20 小时前
EF Core 避坑指南:查询慢、循环查询、并发更新问题如何解决
java·服务器·数据库