下面给出最常用、最简洁的 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>
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();
}
}
LoadingDialog loading = new LoadingDialog(this); // this = Activity loading.show(); // ...耗时操作... loading.dismiss();
三、几点注意
show()/dismiss()。AsyncTask/Thread 里,用
runOnUiThread() 或
Handler(Looper.getMainLooper())。DialogFragment 同理,只要
setCancelable(false) 即可。ProgressBar +
Dialog/DialogFragment,
ProgressDialog 虽仍能用,但随时可能被彻底移除,建议新项目用第二种方案。复制即可运行,屏蔽一切用户点击事件。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048520/viewspace-3104081/ ,如需转载,请注明出处,否则将追究法律责任。