写在前面

Dialog,即对话框,对话框在 Android 中也是非常重要。很多场景都需要用到它,不过 Android 的对话框的基本使用不会很难。今天就来介绍四种基本的用法,后续还可以自定义对话框,也就是说可以自己写一个布局来达到自己想要实现的对话框。

自己定义的对话框就单独放在下一篇日志中吧,毕竟不想写太多

四种基本的对话框

对话框总共有 4 种。第一个是基本的对话框,即对话框的正文部分只有文字,第二个和第三个对话框是单选对话框,只是第三种是需要默认指定选中哪一项,第四个是多选框,通过一个布尔类型的数组来默认哪些是被选中的。

以下将介绍和实例都一一列举出来

第一种对话框

第一种对话框,首先我们需要创建一个 AlertDialog.Builder 对象。默认有一个构造方法,用于指定在哪个 Activity 上面弹出对话框,和 Toast 类似,Toast 也是需要指定在哪一个 Activity 上面。

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

对象创建完成之后,使用 setTitle 设置对话框的标题,使用 setMsg 设置消息内容

builder.setTitle("请回答").setMessage("你觉得《工作细胞》全系列好看吗?");

对话框有三个按钮可以设置,设置了一个就会有按钮出来,不设置就没有按钮出来,这三个方法分别是 setPositiveButton、setNeutralButton、setNegativeButton。这个三个方法翻译成中文感觉怪怪的,就是一个好,中,差三个按钮嘛。这其实也不能完全通过这些方法的意思来。比如我有一个公告要告知用户,我只要一个按钮就够了,但是这三个方法选哪个呢?我觉得都可以,爱用哪个就用哪个,没必要过于纠结在这上面。

该方法需要传入两个参数,一个是按钮文字,另一个就是点击事件。由于这些方法的返回值是当前的对象,所以可以直接进行链式的调用,请看以下代码。

builder.setPositiveButton("好看", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(AlertDialogActivity.this, "谢谢,我们会做的越来越好!", Toast.LENGTH_LONG).show();
        }
    })
    .setNeutralButton("一般", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(AlertDialogActivity.this, "谢谢,看来还需要多改进才是!", Toast.LENGTH_LONG).show();
        }
    })
    .setNegativeButton("难看", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(AlertDialogActivity.this, "谢谢,血小板好桑心呢,555~", Toast.LENGTH_LONG).show();
        }
    }).show();

运行效果如下

第二种对话框

第二种对话框,也就单选的对话框,但是默认没选中。要实现这个功能需要使用 setItems 方法,该方法有两个参数,一个是字符串的数组,另一个就是选中了哪一项之后的点击事件。

final String[] genders = {"男", "女"};
builder1.setItems(genders, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(AlertDialogActivity.this, "你选择了:" + genders[which], Toast.LENGTH_LONG).show();
    }
}).setTitle("请选择性别").show();

运行效果如下

第三种对话框

第三种对话框和第二种差不多,但是默认有选中哪一项。要实现这个功能需要使用 setSingleChoiceItems 方法,该方法有三个参数,比上面这个多了一个,一个是字符串的数组,一个是指定选中的哪一项,另一个就是选中了哪一项之后的点击事件。

AlertDialog.Builder builder2 = new AlertDialog.Builder(AlertDialogActivity.this);
final String[] genders2 = {"男", "女"};
builder2.setSingleChoiceItems(genders2, 0, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(AlertDialogActivity.this, "你选择了:" + genders2[which], Toast.LENGTH_LONG).show();
        dialog.dismiss(); // 选中完成之后才会消失
    }
}).setTitle("请选择性别").show().setCancelable(false); // 这里设置了点击对话框以外的部分不消失

运行效果如下

从上面的 gif 图中发现为什么我选择女的时候不发生变化?那是因为当前的代码是在点击按钮时触发的,所以里面的代码被重新执行了一遍,最后导致之前的内容全部覆盖成原始的状态。

如果不让用户点击其它地方让对话框消失,则设置 setCalcelable 方法,传递的值为 false,请看效果图。

如果要让其消失的话,使用 dismiss 方法即可。

第四种对话框

第四种对话框就是多选对话框了,可以默认选中多项,选中多项是需要传递一个布尔类型的数组。要实现这个方法,则需要使用 setMultiChoiceItems 方法。一个是字符串的数组,一个是指定选中的数组,另一个就是选中了哪一项之后的点击事件。

AlertDialog.Builder builder3 = new AlertDialog.Builder(AlertDialogActivity.this);
final String[] multiChoices = {"AcFun", "bilibili", "嘀哩嘀哩", "樱花动漫"};
final boolean[] multiChecked = new boolean[multiChoices.length];
builder3.setTitle("你喜欢在哪个网站追番").setMultiChoiceItems(multiChoices, multiChecked, new DialogInterface.OnMultiChoiceClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        String msg = isChecked ? "你选择了:" + multiChoices[which] : "你反选了:" + multiChoices[which];
        Toast.makeText(AlertDialogActivity.this, msg, Toast.LENGTH_SHORT).show();
    }
})
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        // 使用字符串构建类,将已经选中的内容添加进去
        StringBuilder sb = new StringBuilder();
        // 循环遍历
        for (int i = 0; i < multiChecked.length; i++) {
            // 如果选中了就添加进到字符串构建类中
            if(multiChecked[i]){
                sb.append(i == multiChecked.length - 1 ? multiChoices[i] : multiChoices[i] + ",");
            }
        }
        // 将构建好的字符串用 toString 方法打印出来
        Toast.makeText(AlertDialogActivity.this, "你喜欢在“" + sb.toString() + "”追番", Toast.LENGTH_LONG).show();
    }
}).show();

不过在 2 和 3 的示例中,我们发现并没有加确定这些按钮呀。那我可不可以添加一个?答案是可以的,根据现有的场景是否添加按钮即可。比如当前的励志,选好之后要进行一个总结,我们就将选中的通过 Toast 来全部展示出来。

运行效果如下

后记

项目的代码都在 AndroidStudy 的 github 仓库中。

本日志对应的代码:点我进入