对话框
-
对话框(Dialog)是一种常用的 UI 组件,它主要用于显示信息、接收用户操作反馈
-
对话框可以包含各种元素,但是主要还是以文本、按钮为主,其次是列表
-
其中,基础对话框是 Android 中最简单的对话框,而后是进度对话框、自定义对话框等
一、UI 线程问题
1、非 UI 线程中创建对话框
- 非 UI 线程中创建对话框会抛出异常
new Thread(() -> {try {ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);progressDialog.setTitle("加载对话框");progressDialog.setMessage("加载中~~~");progressDialog.show();} catch (Exception e) {e.printStackTrace();}
}).start();
- 输出结果
java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-2,5,main] that has not called Looper.prepare()
2、非 UI 线程中显示对话框
- 非 UI 线程中显示对话框会抛出异常
ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");new Thread(() -> {try {progressDialog.show();} catch (Exception e) {e.printStackTrace();}
}).start();
- 输出结果
java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-2,5,main] that has not called Looper.prepare()
3、非 UI 线程中关闭对话框
- 非 UI 线程中关闭对话框不会抛出异常
ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");progressDialog.show();new Thread(() -> {try {Thread.sleep(5 * 1000);progressDialog.dismiss();} catch (Exception e) {e.printStackTrace();}
}).start();
二、外部取消
1、加载对话框外部取消
-
通过
setCancelable(boolean cancelable)
方法设置加载对话框是否可以通过点击外部区域来取消 -
建议对加载对话框禁止点击外部区域来取消,因为加载对话框的取消通常应该由业务代码控制
ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");progressDialog.setCancelable(false); // 建议使用progressDialog.show();
2、进度条对话框外部取消
-
通过
setCancelable(boolean cancelable)
方法设置进度条对话框是否可以通过点击外部区域来取消 -
建议对进度条对话框禁止点击外部区域来取消,因为加载对话框的取消通常应该由业务代码控制
ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle("进度条对话框");
progressDialog.setMessage("加载中~~~");
progressDialog.setMax(100);progressDialog.setCancelable(false); // 建议使用progressDialog.show();new Thread(() -> {for (int j = 0; j <= 100; j++) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}progressDialog.setProgress(j);}progressDialog.dismiss();
}).start();
三、dismiss 方法与 hide 方法
1、基本介绍
-
dismiss 方法:用于完全关闭并移除 ProgressDialog,一旦调用此方法,ProgressDialog 将不再显示在屏幕上,且相关的资源会被移除
-
hide 方法:用于关闭 ProgressDialog,一旦调用此方法,ProgressDialog 将不再显示在屏幕上,但相关的资源不会被移除
2、演示
ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");progressDialog.show();Handler handler = new Handler();handler.postDelayed(() -> progressDialog.hide(), 5 * 1000);