首页 > 其他分享 >6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss 方法与 hide 方法)

6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss 方法与 hide 方法)

时间:2024-10-19 22:16:41浏览次数:8  
标签:Toast hide 对话框 builder dismiss alertDialog AlertDialog show

对话框

  1. 对话框(Dialog)是一种常用的 UI 组件,它主要用于显示信息、接收用户操作反馈

  2. 对话框可以包含各种元素,但是主要还是以文本、按钮为主,其次是列表

  3. 其中,基础对话框是 Android 中最简单的对话框,而后是进度对话框、自定义对话框等


一、UI 线程问题

1、UI 线程中创建对话框
  • UI 线程中创建对话框会抛出异常
try {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder.setTitle("普通对话框");
    builder.setMessage("确定退出吗?");
    builder.setPositiveButton("确定", (dialog, which) -> {
        Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
    });
    builder.setNegativeButton("取消", (dialog, which) -> {
        Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
    });

    AlertDialog alertDialog = builder.create();

    alertDialog.show();
} catch (Exception e) {
    e.printStackTrace();
}
  • 输出结果
java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-2,5,main] that has not called Looper.prepare()
2、UI 线程中显示对话框
  • UI 线程中显示对话框会抛出异常
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("普通对话框");
builder.setMessage("确定退出吗?");
builder.setPositiveButton("确定", (dialog, which) -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
});
builder.setNegativeButton("取消", (dialog, which) -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
});

AlertDialog alertDialog = builder.create();

new Thread(() -> {
    try {
        alertDialog.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 线程中关闭对话框不会抛出异常
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("普通对话框");
builder.setMessage("确定退出吗?");
builder.setPositiveButton("确定", (dialog, which) -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
});
builder.setNegativeButton("取消", (dialog, which) -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
});

AlertDialog alertDialog = builder.create();

alertDialog.show();

new Thread(() -> {
    try {
        Thread.sleep(5 * 1000);
        alertDialog.dismiss();
    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();

二、外部取消

1、普通对话框冲突问题外部取消
  • 通过 setCancelable(boolean cancelable) 方法设置普通对话框是否可以通过点击外部区域来取消
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("普通对话框");
builder.setMessage("确定退出吗?");
builder.setPositiveButton("确定", (dialog, which) -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
});
builder.setNegativeButton("取消", (dialog, which) -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
});

builder.setCancelable(false); // 不建议使用

AlertDialog alertDialog = builder.create();

alertDialog.show();
2、单选对话框冲突问题外部取消
  1. 通过 setCancelable(boolean cancelable) 方法设置单选对话框是否可以通过点击外部区域来取消

  2. 但是不建议对单选对话框禁止点击外部区域来取消,因为用户可能误触发了单选对话框,本来不想做选择

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("单选对话框");

String[] items = {"物理", "化学", "生物", "历史"};
builder.setSingleChoiceItems(items, -1, (dialog, which) -> {
    Toast.makeText(this, "选择了:" + items[which], Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});

builder.setCancelable(false); // 不建议使用

AlertDialog alertDialog = builder.create();

alertDialog.show();
3、多选对话框冲突问题外部取消
  1. 通过 setCancelable(boolean cancelable) 方法设置多选对话框是否可以通过点击外部区域来取消

  2. 但是不建议对多选对话框禁止点击外部区域来取消,因为用户可能误触发了多选对话框,本来不想做选择

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("多选对话框");

String[] items = {"胡萝卜", "白菜", "菠菜", "土豆", "黄瓜", "西红柿"};
boolean[] check = {false, false, false, false, false, false};
builder.setMultiChoiceItems(items, check, (dialog, which, isChecked) -> {
    if (isChecked) {
        check[which] = true;
        Toast.makeText(this, "你选中了:" + items[which], Toast.LENGTH_SHORT).show();
    } else {
        check[which] = false;
        Toast.makeText(this, "你取消了:" + items[which], Toast.LENGTH_SHORT).show();
    }
});

builder.setCancelable(false); // 不建议使用

AlertDialog alertDialog = builder.create();

alertDialog.show();
4、列表对话框冲突问题外部取消
  1. 通过 setCancelable(boolean cancelable) 方法设置列表对话框是否可以通过点击外部区域来取消

  2. 但是不建议对列表对话框禁止点击外部区域来取消,因为用户可能误触发了列表对话框,本来不想做选择

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("课程安排:");

String[] items = {"第一节(数学)", "第二节(地理)", "第三节(历史)", "第四节(美术)"};
builder.setItems(items, (dialog, which) -> {
    Toast.makeText(this, items[which], Toast.LENGTH_SHORT).show();
});

builder.setCancelable(false);

AlertDialog alertDialog = builder.create();

alertDialog.show();

三、冲突问题

1、单选对话框冲突问题
  • setSingleChoiceItems 方法与 setMessage 方法显示区域互相冲突,同时使用时,setMessage 方法设置的内容会覆盖掉 setSingleChoiceItems 方法设置的内容
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("单选对话框");
builder.setMessage("这是单选对话框");
String[] items = {"物理", "化学", "生物", "历史"};
builder.setSingleChoiceItems(items, -1, (dialog, which) -> {
    Toast.makeText(this, "选择了:" + items[which], Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});

AlertDialog alertDialog = builder.create();

alertDialog.show();
2、多选对话框冲突问题
  • setMultiChoiceItems 方法与 setMessage 方法显示区域互相冲突,同时使用时,setMessage 方法设置的内容会覆盖掉 setMultiChoiceItems 方法设置的内容
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("多选对话框");
builder.setMessage("这是多选对话框");
String[] items = {"胡萝卜", "白菜", "菠菜", "土豆", "黄瓜", "西红柿"};
boolean[] check = {false, false, false, false, false, false};
builder.setMultiChoiceItems(items, check, (dialog, which, isChecked) -> {
    if (isChecked) {
        check[which] = true;
        Toast.makeText(this, "你选中了:" + items[which], Toast.LENGTH_SHORT).show();
    } else {
        check[which] = false;
        Toast.makeText(this, "你取消了:" + items[which], Toast.LENGTH_SHORT).show();
    }
});

AlertDialog alertDialog = builder.create();

alertDialog.show();
3、列表对话框冲突问题
  • setItems 方法与 setMessage 方法显示区域互相冲突,同时使用时,setMessage 方法设置的内容会覆盖掉 setItems 方法设置的内容
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("课程安排:");
builder.setMessage("这是列表对话框");
String[] items = {"第一节(数学)", "第二节(地理)", "第三节(历史)", "第四节(美术)"};
builder.setItems(items, (dialog, which) -> {
    Toast.makeText(this, items[which], Toast.LENGTH_SHORT).show();
});

builder.setCancelable(false);

AlertDialog alertDialog = builder.create();

alertDialog.show();

四、dismiss 方法与 hide 方法

1、基本介绍
  1. dismiss 方法:用于完全关闭并移除 AlertDialog,一旦调用此方法,AlertDialog 将不再显示在屏幕上,且相关的资源会被移除

  2. hide 方法:用于关闭 AlertDialog,一旦调用此方法,AlertDialog 将不再显示在屏幕上,但相关的资源不会被移除

2、演示
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("普通对话框");
builder.setMessage("确定退出吗?");
builder.setPositiveButton("确定", (dialog, which) -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
});
builder.setNegativeButton("取消", (dialog, which) -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
});

AlertDialog alertDialog = builder.create();

alertDialog.show();

Handler handler = new Handler();

handler.postDelayed(() -> alertDialog.hide(), 5 * 1000);

标签:Toast,hide,对话框,builder,dismiss,alertDialog,AlertDialog,show
From: https://blog.csdn.net/weixin_52173250/article/details/143085549

相关文章

  • Qt 模态对话框属性
    exec()QDialogdlg(this);dlg.exec();setModal()QDialogdlg(this);dlg.setModal(true); //相当于dlg.setWindowModality(Qt::ApplicationModal);dlg.show();setWindowModality()QDialogdlg(this);dlg.setWindowModality(Qt::ApplicationModal);dlg.show();枚......
  • C#的自定义对话框和提示窗体 - 开源研究系列文章
          上次的应用因为需要用到对话框和提示窗体,然后系统自带的MessageBox界面个人又看不上,所以就想自己编写一个自定义的窗体,于是有了本文,具体的已经应用到笔者其它的应用里了。 1、项目目录;  2、源码介绍;1)实现;        2)......
  • Qt自定义一个圆角对话框
    如何得到一个圆角对话框?步骤:1、继承自QDiaglog2、去掉系统自带的边框3、设置背景透明,不设置4个角会有多余的部分出现颜色4、对话框内部添加1个QWidget,给这个widget设置圆角,并添加到布局中让他充满对话框5、后续对话框的所有内容都添加在这个widget里面举例:#ifndefRO......
  • Flutter功能性组件(1):对话框
    Material库提供了三种基本对话框组件AlertDialog通常用于提示型对话框SimpleDialog通常用于列表型对话框Dialog通常用于自定义布局元素的对话框弹出对话框时,调用showDialog函数,将对话框控件传入,由于对话框本身是路由,所以关闭对话框时,需使用Navigator.of(context).pop......
  • 前端零代码-技术原理:对话框嵌套和自定义按钮| uiotos致敬amis、appsmith、codewave、g
    对话框有默认标题头和脚,带有默认的取消、确定、关闭等按钮:   对话框编辑状态和运行状态UIOTOS中对话框属常见容器,内容由任意其他页面嵌套而来。如下所示:                                   ......
  • 火语言RPA流程组件介绍--处理网页对话框
    ......
  • MISC - 第五天( RouterPassView 路由器密码修复工具,steghide文件隐藏工具,多压缩包伪
    前言各位师傅大家好,我是qmx_07,今天继续讲解MISC相关知识点荷兰宽带数据泄露下载附件,是一个bin后缀的宽带数据文件,使用RouterPassView工具查看现代路由器都会让用户备份一个配置文件,以便重置恢复数据一般配置文件会包含账户名和密码RouterPassView介绍:用于恢复路......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版实现前端框架内置对话框在Word中
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做......
  • Electron - #005 后端node调用文件打开对话框获取绝对路径传递给前端
    文章目录后端node调用文件打开对话框获取绝对路径传递给前端1目标2步骤2.1src-electron/main.js2.2src-electron/preload.js2.3HelloWorld.vue2.4运行工程后端node调用文件打开对话框获取绝对路径传递给前端1目标后端node调用文件打开对话框获取绝对路径......
  • 小猪佩奇学英语——第五天——hide and seek
    例句hideandseek,捉迷藏seek,寻找find,找到了ItisGeorge'sturntohide.It'sourturn.用is是因为虽然我们是2个以上的人,但是我们是一组,轮到我们的只有一轮,所以是单数。It'syourturn.轮到你们了It'stheriturn.轮到他们了。It'ssb'sturnto..........