Android -对话框AlertDialog

文章目录

  • 前言
  • 一、AlertDialog用法
    • 1.使用步骤
    • 2.AlertDialog.Builder对象的常用属性讲解
    • 二、AlertDialog实例代码
      • 提醒消息对话框
      • 提问对话框
      • 普通列表对话框
      • 多选列表对话框
      • 自定义布局对话框
      • 三、ProgressDialog进度条对话框
        • 使用方法
        • ProgressDialog属性
        • 实例代码
        • 四、日期时间选择对话框
          • 日期选择对话框
          • 时间选择对话框
          • 选择日期范围实例代码

            前言

            代码直接复制粘贴使用


            一、AlertDialog用法

            1.使用步骤

            1.创建一个对话框生成器AlertDialog.Builder对象

            2.设置AlertDialog.Builder对象的属性,图标,标题,内容等

            3.调用create()方法创建一个对话框AlertDialog

            4.调用AlertDialog的show()方法显示对话框

            5.调用AlertDialog的dismiss()方法关闭对话框

            2.AlertDialog.Builder对象的常用属性讲解

            1.设置对话框的图标

             setIcon(R.mipmap.ic_launcher)
            

            2.设置对话框标题

            setTitle("系统警告")
            

            3.设置对话框内容

             setMessage("电量过低,一分钟后将自动关机!")
            

            4.设置点击对话框外的区域是否关闭对话框

             setCancelable(false)
            

            5.设置对话框按钮功能(系统提供的对话框有三个按钮。不设置则不显示,点击按钮后对话框会自动关闭)

            第一个参数为按钮上显示的文字,第二个参数为按钮监听器

            setNegativeButton("否", new DialogInterface.OnClickListener() {...})
            setNeutralButton("中", new DialogInterface.OnClickListener() {...})
            setPositiveButton("是", new DialogInterface.OnClickListener() {...})
            

            6.设置单选列表对话框

            第一个参数为数组选项列表,第二个参数为选项监听器

            setItems( new String[]{"A", "B", "C", "D", "E"}, new DialogInterface.OnClickListener() {...})
            

            7.设置多选列表对话框

            第一个参数为数组选项列表,第二个参数为选项的默认选中状态,第三个参数为选项监听器

            setMultiChoiceItems(new String[]{"A", "B", "C", "D", "E"}, new boolean[]{false, false, false, false, false}, new DialogInterface.OnMultiChoiceClickListener() {...})
            

            8.自定义对话框

            参数为自定义布局

            setView(view)
            

            二、AlertDialog实例代码

            提醒消息对话框

            设置一个中性按钮即可,点击关闭对话框,还要设置点击对话框以外的区域关闭对话框

             public void alertDialog1() { AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setIcon(R.mipmap.ic_launcher)
                            .setTitle("系统提示")
                            .setMessage("电量过低,请尽快充电!")
                            .setCancelable(true)
                            .setNeutralButton("好的", new DialogInterface.OnClickListener() { @Override
                                public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "你点击了好的", Toast.LENGTH_SHORT).show();
                                }
                            }).create().show();
                }
            

            提问对话框

            设置是和否两个按钮,设置点击对话框以外的区域不关闭对话框

             public void alertDialog2() { AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setIcon(R.mipmap.ic_launcher)
                            .setTitle("系统提示")
                            .setMessage("您确定要退出吗?")
                            .setCancelable(false)
                            .setNegativeButton("否", new DialogInterface.OnClickListener() { @Override
                                public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "你点击了否", Toast.LENGTH_SHORT).show();
                                }
                            })
                            .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override
                                public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "你点击了是", Toast.LENGTH_SHORT).show();
                                }
                            }).create().show();
                }
            

            普通列表对话框

            不用设置按钮,点击对应的选项后会自动关闭对话框

            防止意外关闭选项框,所以设置以下点击对话框以外的区域不关闭对话框

             public void alertDialog3() { AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    String[] array = new String[]{"A", "B", "C", "D", "E"};
                    builder.setIcon(R.mipmap.ic_launcher)
                            .setTitle("单选题,请选择正确的答案!")
                            .setCancelable(false)
                            .setItems(array, new DialogInterface.OnClickListener() { @Override
                                public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "你选择了" + array[which], Toast.LENGTH_SHORT).show();
                                }
                            }).create().show();
                }
            

            多选列表对话框

            需要监听选项,添加两个按钮,一个确定按钮,一个中性按钮,同样设置一下点击对话框以外的区域不关闭对话框

             public void alertDialog4() { AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    final String[] fruits = new String[]{"A", "B", "C", "D", "E"};
                    boolean[] checkItems = new boolean[]{false, false, false, false, false};
                    builder.setIcon(R.mipmap.ic_launcher)
                            .setTitle("多选题,请选择正确的答案!")
                            .setCancelable(false)
                            .setMultiChoiceItems(fruits, checkItems, new DialogInterface.OnMultiChoiceClickListener() { @Override
                                public void onClick(DialogInterface dialog, int which, boolean isChecked) { checkItems[which] = isChecked;
                                }
                            })
                            .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override
                                public void onClick(DialogInterface dialog, int which) { String res = "";
                                    for (int i = 0; i < checkItems.length; i++) { if (checkItems[i])
                                            res += fruits[i] + " ";
                                    }
                                    Toast.makeText(MainActivity.this, "你选择了:" + res, Toast.LENGTH_SHORT).show();
                                }
                            })
                            .setNeutralButton("关闭", new DialogInterface.OnClickListener() { @Override
                                public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "你点击了关闭", Toast.LENGTH_SHORT).show();
                                }
                            }).create().show();
                }
            

            自定义布局对话框

            效果图:

            首先创建一个布局文件lyout.xml文件

            然后在java代码中添加到AlertDialog中

                     
             public void alertDialog5() { View view = MainActivity.this.getLayoutInflater().inflate(R.layout.layout, null,false);
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setCancelable(false)
                            .setView(view);
                    AlertDialog alert = builder.create();
                    alert.show();
                    view.findViewById(R.id.btn_cancle).setOnClickListener(new View.OnClickListener() { @Override
                        public void onClick(View v) { Toast.makeText(MainActivity.this, "你点击了右上角的X", Toast.LENGTH_SHORT).show();
                            alert.dismiss();
                        }
                    });
                    view.findViewById(R.id.btn_yes).setOnClickListener(new View.OnClickListener() { @Override
                        public void onClick(View v) { Toast.makeText(MainActivity.this, "你点击了是", Toast.LENGTH_SHORT).show();
                            alert.dismiss();
                        }
                    });
                    view.findViewById(R.id.btn_no).setOnClickListener(new View.OnClickListener() { @Override
                        public void onClick(View v) { Toast.makeText(MainActivity.this, "你点击了否", Toast.LENGTH_SHORT).show();
                            alert.dismiss();
                        }
                    });
                }
            

            三、ProgressDialog进度条对话框

            使用方法

            1.创建ProgressDialog对象

            2.设置ProgressDialog对象的属性

            3.调用ProgressDialog对象的show方法显示对话框

            4.调用ProgressDialog对象的dismiss方法关闭对话框

            ProgressDialog属性

            AlertDialog.Builder对象的属性ProgressDialog都可以用,就不再赘述,重点是ProgressDialog新增的属性

            1.setIndeterminate(true)

            设置进度条是否显示进度,true为不显示进度,进度条会显示为无限动画,适用于应用安装等待的场景,false为显示进度,根据具体进度值显示

            2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

            设置进度条样式,STYLE_SPINNER为圆形,STYLE_HORIZONTAL为横线形,没有设置这个属性的时候默认为圆形

            这个属性为圆形或者未设置这个属性时,设置setIndeterminate属性是无效的,因为系统提供的圆形进度条无法显示进度

            3.setProgress(20);

            设置进度条当前进度,总进度值为100

            实例代码

            代码讲解:

            Handler用来更新进度条显示

            TimerTask用来模拟应用下载并实时返回下载进度,每秒更新一次进度值,当进度达到100后,将进度条修改为不显示进度值的无限动画模拟应用安装,2秒后安装完成自动关闭对话框

            MainActivity.java

            public class MainActivity extends AppCompatActivity { private ProgressDialog pgDialog;
                private int gres = 0;
                Handler myHandler = new Handler() { @Override
                    public void handleMessage(Message msg) { if (msg.what == 111) { pgDialog.setProgress(gres);
                        }
                        if (msg.what == 222) { pgDialog.setTitle("正在安装中");
                            pgDialog.setMessage("正在安装中,请稍后...");
                            pgDialog.setIndeterminate(true);
                        }
                    }
                };
                @Override
                protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main2);
                    alertDialog7();
                }
                public void alertDialog7() { pgDialog = new ProgressDialog(this);
                    pgDialog.setIcon(R.mipmap.ic_launcher);
                    pgDialog.setTitle("正在下载");
                    pgDialog.setMessage("正在下载,请稍后...");
                    pgDialog.setCancelable(true);
                    pgDialog.setIndeterminate(false);
                    pgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                    pgDialog.show();
                    //执行事务,每秒钟返回一次事务执行进度
                    new Timer().schedule(new TimerTask() { @Override
                        public void run() { gres = gres + 10;
                            myHandler.sendEmptyMessage(111);
                            if (gres >= 100) { myHandler.sendEmptyMessage(222);
                                try { Thread.sleep(3000);
                                } catch (InterruptedException e) { e.printStackTrace();
                                }
                                pgDialog.dismiss();
                                cancel();
                            }
                        }
                    }, 0, 1000);
                }
            }
            

            四、日期时间选择对话框

            日期选择对话框

            重点:

            DatePickerDialog(日期选择对话框)的setOnDateSetListener方法,监听选择的日期

            基本用法实例:

            创建DatePickerDialog对象时携带参数,参数依次为(上下文,OnDateSetListener()监听器,年,月,日 )

            弹出的日期选择框中默认为参数中的年月日

            需要注意的是月份一定要+1才是正确的

            public void createDialog2(){DatePickerDialog dpDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {@Override
                	public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { String result = "你选择的是"+year+"年"+(month+1)+"月"+dayOfMonth+"日";
                    	Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
                	}
            	},2012,8,12);
            	dpDialog.show();
            }
            

            时间选择对话框

            重点:

            TimePickerDialog(时间选择对话框)的setOnTimeSetListener方法,监听选择的时间

            基本用法实例:

            创建TimePickerDialog对象时携带参数,参数依次为(上下文,OnTimeSetListener监听器;小时,分钟,是否采用24小时制)

            弹出的日期选择框中默认为参数中的小时分钟

             public void createDialog3(){ TimePickerDialog dpDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute) { String result = "你选择的是"+hourOfDay+"时"+(minute+1)+"分";
                            Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
                        }
                    },16,45,true);
                    dpDialog.show();
                }
            

            选择日期范围实例代码

            public class MainActivity4 extends AppCompatActivity { DatePickerDialog dpDialog;
                DatePickerDialog dpDialog2;
                int start_year;
                int start_month;
                int start_day;
                String result = null;
                @Override
                protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main4);
                    createDialog4();
                }
                public void createDialog4() { Calendar cale = Calendar.getInstance();
                    dpDialog = new DatePickerDialog(MainActivity4.this, new DatePickerDialog.OnDateSetListener() { @Override
                        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { start_year = year;
                            start_month = month + 1;
                            start_day = dayOfMonth;
                            dpDialog2 = new DatePickerDialog(MainActivity4.this, new DatePickerDialog.OnDateSetListener() { @Override
                                public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { result = "你选择的日期范围为" + start_year + "年" + start_month + "月" + start_day + "日" + " - " + year + "年" + (month + 1) + "月" + dayOfMonth + "日";
                                    Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
                                }
                            }, start_year, start_month, start_day + 7); //设置终止日志选择框默认日期为起始日期+7天
                            dpDialog2.setMessage("请选择终止日期");
                            dpDialog2.show();
                        }
                    }, cale.get(Calendar.YEAR), cale.get(Calendar.MONTH), cale.get(Calendar.DAY_OF_MONTH)); //设置起始日期选择框默认日期为今天
                    dpDialog.setMessage("请选择起始日期");
                    dpDialog.show();
                }
            }