天天看点

Android AlertDialog的基本用法

在Android开发中,我们会遇到很多信息提示,这在人机交互方面也是非常有用的一种方式,Android中的AlertDialog类是比较常用的一种信息提示方法,它可以通过设置一个对话框来进行提示,例如我们在windows系统中经常遇到的一些“确认”、“取消”的消息提示框等,在Android中都可以利用AlertDialog这个类来实现,下面就简单的介绍一下这个类。通过查看源码发现,AlertDialog这个类并没有public方法,所以在使用该类时,需要通过Builder类来创建,然后使用Builder.show()方法来显示。

1.简单的创建一个AlertDialog对话框

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.drawable.manual)
                .setTitle("是否下载文件")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        new AlertDialog.Builder(MainActivity.this).setMessage("文件已经下载成功").create().show();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        new AlertDialog.Builder(MainActivity.this).setMessage("文件下载已经取消").create().show();
                    }
                });
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
           

上述通过Builder类创建了一个标准的AlertDialog的对话框,而且,我们从上述代码中,可以看出设置了两个按钮,一个是setPositiveButton,一个是setNegativeButton,其中有两个参数,源代码中这两个方法都有两种重载形式,只是第一个参数不同,CharSequence text这个擦书表示可以直接指定文本或字符串变量,而int textId这个参数需要制定一个字符串资源ID,类似于String.xml文件中一一对应的字符串ID,其本质上是一致的,第二个参数则是对于该Button的监听事件,我们可以在该监听事件中添加我么所需要实现的功能,例如一些参数设置,例如当前信息提示等。

2.自定义实现对话框

2.1三个按钮的对话框

在使用对话框的时候,我们或许会发现,有些时候,对话框上不一定只有“确认”、“取消”两个按钮,还会有第三个按钮“忽略”,那么我们可以通过setNeutralButton方法来设置第三个按钮,但是要注意,虽然三个按钮的调用顺序是随意的(即在代码书写的时候,位置是随意的),但是使用的时候,顺序却是一定的,即setPositiveButton总是排在第一位,setNeutralButton排第二位,setNegativeButton排第三位,在AlertDialog对话框中,最多只能显示三个按钮。

2.2带选项的对话框

从本质上讲,带选项的对话框就有点儿类似于参数设置的对话框了,那么先讲一下如何自定义参数设置的对话框。

我们都使用过QQAndroid版,在主界面中,点击右上角的Menu会出现一个列表,然后单击其中的一项会弹出相应的操作界面,那么实现这个功能,其实很简单,在menu的监听事件中添加一个Intent来启动一个Activity即可,通过重新定义编写一个layout布局文件即可,但是对于简单的弹出对话框,这样就会显得大材小用了,所以可以通过定义一个AlertDialog来实现简单的对话框功能。

例如实现一个可选择性的AlertDialog,需要用到setSingleChoiceItems这个方法,这个方法可以创建带单选按钮的列表对话框,查阅源码可知,它有四种重载形式,区别在于第一个参数,第一个参数代表数据源(即选择的列表数据),目前支持四种数据源,有数组资源、数据集、字符串数组、listAdapter,第二个参数表示对于该选项是否选中,0代表选中,而小于0代表均为被选中。

部分代码如下:

new AlertDialog.Builder(this)
                .setTitle("选择省份")
                .setSingleChoiceItems(provinces, -1, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        index = which;
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        new AlertDialog.Builder(MainActivity.this)
                                .setMessage("您已经选择了:" + index + ":" + provinces[index]).show();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        new AlertDialog.Builder(MainActivity.this)
                                .setMessage("您未选择!").show();
                    }
                })
                .show();
           

其中,provinces为一个String类型的数组。

2.3进度条对话框

通过ProgressDialog来实现,下面是通过自定义一个方法来实现进度条功能。

private void showProgressDialog(int style){
        progressDialog = new ProgressDialog(this);
        progressDialog.setIcon(R.drawable.counter);
        progressDialog.setTitle("正在处理数据...");
        progressDialog.setMessage("请稍后...");
        //设置进度对话框风格
        progressDialog.setProgressStyle(style);
        //设置进度对话框的最大进度值
        progressDialog.setMax(MAX_PROGRESS);
        //设置进度对话框的"暂停"按钮
        progressDialog.setButton("暂停", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //通过删除消息代码的方式停止计时器
                progressHandler.removeMessages(1);
            }
        });
        //设置进度对话框的"取消"按钮
        progressDialog.setButton2("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //通过删除消息代码的方式停止计时器
                progressHandler.removeMessages(1);
                //恢复进度初始值
                progress = 0;
                progressDialog.setProgress(0);
            }
        });
        progressDialog.show();
        progressHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (progress >= MAX_PROGRESS){
                    //进度达到最大值,关闭对话框
                    progress = 0;
                    progressDialog.dismiss();
                    Toast.makeText(MainActivity.this,"下载完成!",Toast.LENGTH_LONG).show();
                }else {
                    progress++;
                    //进度递增1
                    progressDialog.incrementProgressBy(1);
                    //随机设置下一次递增进度(调用handleMessage方法)的时间(50+毫秒
                    // )
                    progressHandler.sendEmptyMessageDelayed(1,50 + new Random().nextInt(500));
                }
            }
        };
        //设置进度初始值
        progress = (progress > 0) ? progress : 0;
        progressDialog.setProgress(progress);
        progressHandler.sendEmptyMessage(1);
    }
           

在调用该方法的时,需要传入的是该进度条的style,一般有两种,一种是显示数值的条形进度条ProgressDialog.STYLE_HORIZONTAL,还有一种是不显示数值的圆形进度条ProgressDialog.STYLE_SPINNER。

2.4自定义对话框

那么如果我们需要自定义一个带有图片,同时又可以自定义位置,修改对话框基本属性的AlertDialog该如何做呢?

/**
         * 自定义设置对话框位置
         * */
        //获得对话框的windows,并设置位置
        Window window = alertDialog.getWindow();
        //顶端
//        window.setGravity(Gravity.TOP);
        //左上方
//        window.setGravity(Gravity.TOP|Gravity.LEFT);
        //自定义x、y位置
        WindowManager.LayoutParams lp = window.getAttributes();
        //设置水平偏移量
        lp.x = -20;
        //设置数值偏移量
        lp.y = -120;
        //设置透明度
        lp.alpha = 1.0f;
        window.setAttributes(lp);
        alertDialog.show();


        /**
         * 对话框按钮和文本中间插入图片
         * */
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setMessage(Html.fromHtml("哈哈,<img src='' />你好.", new Html.ImageGetter() {
                    @Override
                    public Drawable getDrawable(String source) {
                        Drawable drawable = getResources().getDrawable(R.drawable.tamaburger);
                        drawable.setBounds(0,0,32,32);
                        return drawable;
                    }
                },null))
                .setPositiveButton(Html.fromHtml("<img src=''/>确定", new Html.ImageGetter() {
                    @Override
                    public Drawable getDrawable(String source) {
                        Drawable drawable = getResources().getDrawable(R.drawable.zukitchi);
                        drawable.setBounds(0,0,10,10);
                        return drawable;
                    }
                },null),null).create();
        dialog.show();
           

上述代码实现了自定义对话框的功能,具体的注释也很清楚了,这里不再赘述。