安卓中的几种Dialog

由于对话框用的并不是很多,每次项目中需要的时候,都需要去baidu一把,今天就把常见的几种对话框整理一下,也把这个基础的知识点大概的复习复习。好了,我们要知道安卓对话框对应的类是Dialog,我们来看看这个类的结构,按Ctrl+T 如下图:(因为android studio的继承关系没有Eclispe的显示明确,这里就在Eclipse中来了个截图)。

可以看见Dialog有很多的子类,在这里我们主要看AlertDialog和它的三个子类,分别为DatePickerDialog、ProgressDialog和TimePickerDialog。我们平常的对话框,由这四个类就可以完成。、

好了下面我们就直接上干货,直接看看每一种的对话框,先来看第一种

第一种:普通的AlertDialog

来看效果图,如下:

来看代码的实现:
` public void showAD(View view) {

    /**
     * 使用的是方法链
     */
    new AlertDialog.Builder(this)
            .setIcon(R.mipmap.ic_launcher)  //设置标题图标
            .setTitle("删除数据")      //设置标题
            .setMessage("你确定要删除数据吗?")//设置信息
            .setCancelable(false)//不能通过返回按键来取消对话框
            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
                }
            }) //设置确定按钮和点击事件
            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
                }
            })   //设置取消按钮和点击事件
            .show();  //创建和显示Dialog

}`

由于AlertDilaog没有公开的构造方法所以new AlertDialog.Builder(this),来创建出的是一个AlertDialog.builder对象,上面的方法体我用方法链的形式写的,因为这几个方法的返回值是一样的,并且可以减少一些代码量,然后再调用setIcon,setMessage…等来进行对话框的设置,这里通过setPositiveButton来创建了一个确定按钮,第一个参数是按钮显示的名字,可以任意起,第二个参数是该按钮的点击事件,这里是显示了一个Toast,取消按钮是同样的道理。最后通过show()来将警告框显示出来。好了下面我们来看看第二种

第二种:单选对话框

同样的先看效果图:

代码实现:

public void showSingleAD(View view) {
    final String[] strings = {"红", "蓝", "绿", "灰"};
    new AlertDialog.Builder(this)
            .setTitle("单选弹出框")
            .setSingleChoiceItems(new String[]{"红", "蓝", "绿", "灰"}, 1, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, strings[which], Toast.LENGTH_SHORT).show();
                    dialog.dismiss();//移除警告框
                }
            })
            .show();
}

我们来看setSingleChoiceItems()这个方法,第一个参数是String数组类型的,代表对话框显示的单选选项,以上代码我们定义了一个strings的数组,第二个参数是int型的,代表的是默认的选中项,

对应着第一个参数的词表,也是从0开始的,注意不要越界。第三个参数是单选选中的点击事件,这里我们是打印了一个Toast和将该对话框通过dismiss()方法来隐藏。

第三种:多选项对话框

还是来看效果图:


来看看代码的实现:

 public void showMultipleAD(View view) {
    final String[] strings = {"篮球", "足球", "乒乓球", "排球", "橄榄球"};
    boolean[] booleen = {true, false, true, false, false};

    new AlertDialog.Builder(this)
            .setTitle("多选弹出框")

            .setMultiChoiceItems(strings, booleen, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    Toast.makeText(MainActivity.this, strings[which] + isChecked, Toast.LENGTH_SHORT).show();
                }
            })

            .show();
}

来分析代码,最主要的是这个setMultiChoiceItems方法,该方法第一个参数是string[]类型的,代表的是显示的多选按钮,我们同样的是定义了一个string[]类型的strings来代表这些多选框的内容,第二个参数不同于单选框,这里是一个boolean[]类型的数组,用来表示默认的那些选项是选中的,它的元素对应着第一个参数,选中是true,未选中是false,这里我定义的是boolean[]的booleen,里面的元素自己根据具体情况来写就行了,第三个参数是每选中一个选项的点击事件,这里我显示了一个Toast来显示点击了的选项的名字和是否选中状态。

第四种:自定义AlertDialog:
老套路线上图:

虽然图很丑,我们主要来看看怎么把我们想要的view样式添加到警告框中兵显示出来,我们来吧代码贴出来。

public void showCustomAD(View view) {
    View inflate = View.inflate(this, R.layout.customalertdialog, null);
    new AlertDialog.Builder(this)
            .setView(inflate)
            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();

                }
            })

            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
                }
            })

          .show();

           }

其他的方法我们就不说了,主要来看setView()这个方法,参数是一个View类型的,没错,这里就是我们要加载进来的自定义的view,我通过View的inflate方法将自己定义的布局文件加载为view。是不是很简单。

以上这几种类型的对话框使用的是AlertDialog这个类来实现的,进度条的显示框是使用的ProgressDialog来创建的。那么,我们就来看看显示进度条的提示框。

第5种:圆形的提示框

   /**
      * 显示圆形进度ProgressDialog
      * @param v
      * @throws InterruptedException 
    */
public void showPD(View v){
    final ProgressDialog dialog = ProgressDialog.show(this, "数据加载", "数据加载中...");

    //模拟做一个长时间的工作
    //长时间的工作不能在主线程做, 得启动分线程完成
    new Thread(){
        public void run() {//分线程
            for(int i=0;i<20;i++) {
                //休息一会
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //移除dialog
            dialog.dismiss();//方法在分线程执行, 但内部使用Handler实现主线程移除dialog


    }.start();

}

默认的ProgressDialog.show()方法创建就是默认的圆形进度条的提示框,当然了,这里也可以通过new ProgressDialog()的方法来先创建一个ProgressDialog的对象,然后再通过对象去设置一些属性,比如,标题啦,样式啦,下面创建水平进度条样式的时就使用了这种方法。好了,我们来看上面的代码,先看show(),该方法的第一个参数不说多,就是上下文对象,第二个参数是String类型的,作用了来设置提示框的标题的,第三个参数也是String类型的,作用是来设置提示内容的。这样就显示出了一个圆形进度条的提示框,我们这种进度条的提示框主要是用来进行耗时操作的时候来显示,为了给客户一个良好的用户体验,这里我们就新建了一个县城,模拟了一个耗时操作,等耗时操作完成后通过dialog.dismiss()来将提示款隐藏。但是这个方法是是在分线程来执行的,我们不是说了嘛。UI操作必须在主线程中去执行吗?其实dismiss()的内部使用Handler实现主线程移除dialog。

第6种:水平进度条

  /**
     * 显示水平进度ProgressDialog
     * @param v
     */
public void showPD2(View v) {
    //1. 创建dialog对象
    final ProgressDialog pd = new ProgressDialog(this);
    //2. 设置样式
    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    //3. 显示
    pd.show();

    //4. 启动分线程, 加载数据, 并显示进度, 当加载完成移除dilaog
    new Thread(new Runnable() {
        @Override
        public void run() {
            int count = 20;
            //设置最大进度
            pd.setMax(count);
            for(int i=0;i<count;i++) {
                //休息一会
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                pd.setProgress(i);
            }
            //移除dialog
            pd.dismiss();
        }
    }).start();
}

这里就是通过 new ProgressDialog();方法来new了一个ProgressDialog对象,然后通过setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)来将进度条的样式设置为水平样式,在shiow()出来,我们还是一样,模拟了一个耗时的操作,并且通过setMax()设置了进度条的最大进度,在分线程模拟的就是水平进度条的一个递增效果。最后dismiss()将提示框隐藏。

接下来,我们开看看时间提示框控件,主要用到类是最开始说到的DatePickerDialog、和TimePickerDialog.下面就来看看吧。

第7种:日历提示框

这个是最新安卓7.0的显示效果,是不是很酷
代码:

  /**
 * 日历提示框
 * @param view
 */
 public void ShowDatePickerAD(View view){

   Calendar instance = Calendar.getInstance();
   int year = instance.get(Calendar.YEAR);  //得到年
   int month = instance.get(Calendar.MONTH);  //得到月
   final int day = instance.get(Calendar.DAY_OF_MONTH);  //得到

   new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                //点击确定按钮后的回调
            }
        },year,month,day).show();

 }

我们是通过new了一个DatePickerDialog后在通过show()来显示的,我们来看DatePickerDialog()这个构造方法中的参数,第一个是上下文,第二个是在显示出的提示框的点击确定按钮的点击事件,这个点击事件接口的参数,就是我们通过日历提示框选中后的日期。第三个参数是年,第四个参数是月,第五个参数是日,这几个参数我们通过Calender日历这个类来获取到当前的年月日的,然后传入即可。

第8种:时间提示框

代码:

 public void ShowTimePickerAD(View view){

    Calendar instance = Calendar.getInstance();
    int hour = instance.get(Calendar.HOUR_OF_DAY);  //得到时
    final int minute = instance.get(Calendar.MINUTE);  //得到分

     new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
         @Override
         public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                 //点击确定按钮后的回调
         }
     },hour,minute,false).show();

 }

这个和上面的日历提示框基本差不多,不过这里new的是TimePickerDialog的对象,这个构造方法的参数也是与上面相类似,第一个参数是上下文,第二个参数也是确定按钮得问点击事件的监听,第三个和第四个分别为时、分,这里也是通过Calender这个类来获取的,然后在传入得到。最后在show()出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦茶子12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值