信息提醒之对话框(AlertDialog + ProgressDialog)-更新中(上)

简介: 信息提醒之对话框(AlertDialog + ProgressDialog)-更新中

概念


Android中的对话框需要使用AlertDialog类来显示,主要用于显示提醒信息,不过这个对话框类可不仅仅能用来显示一些信息,我们可以在对话框中防止任何的控件,使其成为一个复杂且功能强大的用户接口。一个典型的例子就是使用AlertDialog做一个登录对话框。


对话框的基本用法


通过查看AlertDialog类,我们可以发现,该类并没有public的构造方法,因此我们不能直接创建AlertDialog对象。


为了创建AlertDialog对象,我们需要使用Builder类,该类是AlertDialog的内部类。


首先,必须创建AlertDialog.Builder对象

然后,通过Builder的show方法显示对话框

或者通过Builder.create方法返回AlertDialog对象,再通过AlertDiaolg.show方法显示对话框。


带2个按钮(确认、取消)的对话框


显示这样的对话框的关键是如何显示两个按钮以及响应这两个按钮的单击事件。 通过AlertDialog.setPostitiveButton和AlertDialog.setNegativeButton可以为对话框添加两个按钮。


我们来看下这两个方法的定义

public Builder setPositiveButton(CharSequence text, final OnClickListener listener)
public Builder setPositiveButton(@StringRes int textId, final OnClickListener listener)
public Builder setNegativeButton(CharSequence text, final OnClickListener listener) 
public Builder setNegativeButton(@StringRes int textId, final OnClickListener listener)


从上述的源码中可以看出,setPositiveButton和setNegativeButton方法各有两个重载形式,实现的功能是一致的,区别在于 text参数可以直接指定文本或者String变量,textId参数则需要指定一个字符串资源ID(需要在res\values目录中的xml文件中定义)。


一般来讲,setPositiveButton的按钮来添加 “确定”“Yes”等按钮,setNegativeButton方法来添加“取消”,”cancel”等。


OnClickListener为DialogInterface.OnClickListener中的类。响应用户的操作。


image.png

        new AlertDialog.Builder(this)
                .setIcon(R.drawable.flag_mark_blue)
                .setTitle("是否下载文件?")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 提示信息
                        AlertDialog dialog1 = new AlertDialog.Builder(DialogDemoListAct.this)
                                .setMessage("文件已下载成功")
                                .create();
                        dialog1.show();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 取消提示信息
                        new AlertDialog.Builder(DialogDemoListAct.this)
                                .setMessage("文件下载取消")
                                .create()
                                .show();
                    }
                })
                .show();


在使用AlertDialog类来创建对话框时需要注意以下几点:


setPositvieButton和setNegativeButton方法的第二个参数的数据类型是android.content,DialogInterface.OnClickListener,而不是android.view.View.OnClickListener. View.OnClickListener接口使用在视图上的,这一点在使用时要注意。

使用show()方法显示对话框是异步的,也就是说,当调用AlertDialog.Builder.show 或者AlertDialog.show方法显示对话框后,show方法会立即返回,并且继续执行后面的代码。

单击使用setPositiveButton和setNegativeButton方法添加的按钮后,即使单击事件中不写任何代码,对话框也是会关闭的

如果某个按钮单击后只需要关闭对话框,并不需要进行任何处理,listener参数设置null即可

AlertDialog类还有很多setXXX方法用于指定对话框的其他资源,可以是对话框更加丰满美观。


带3个按钮(覆盖、忽略、取消)的对话框


用AlertDialog类创建的对话框最多可以添加3个按钮,除了上面添加两个方法,还可以使用setNeutralButton方法向对话框中添加第三个按钮


image.png

   new AlertDialog.Builder(this)
                .setIcon(R.drawable.flag_mark_violet)
                .setTitle("是否覆盖文件?")
                .setMessage("覆盖后源文件将丢失...吧啦吧啦")
                .setPositiveButton("覆盖", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                })
                .setNeutralButton("忽略", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        new AlertDialog.Builder(DialogDemoListAct.this)
                                .setMessage("忽略覆盖文件操作")
                                .create()
                                .show();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                })
                .show();


注意事项:


setPositiveButton setNegativeButton setNeutralButton的调用顺序可以是任意的,但是无论调用顺序是什么,在2.3这些低版本中,setPositiveButton 总会在左起第一个 ,setNeutralButton位于左起第二个,setNegativeButton位于左起第三个。 在高版本中,Googel调整了显示位置,setPositiveButton位于右起第一位,setNeutralButton位于右起第二个,setNegativeButton位于右起第三位。

使用AlertDialog类创建的对话框最多只能有3个按钮,因此,就算多次调用这3个设置按钮的方法,最多也只能显示3个。

这3个设置对话框按钮的方法虽然可以调用多次,但是系统只以每一个方法最后一次调用的为准。


简单列表对话框-setItems


通过AlertDialog.Builder类的setItems方法可以创建简单的列表对话框。 实际上,这种对话框相当于将ListView控件放在对话框上,然后在ListView中添加若干简单的文本()。


在这个实例中,选择后显示选中值,5S后自动关闭。


image.png

setItems方法定义如下

// items表示用于显示在列表中的字符串数组
public Builder setItems(CharSequence[] items, final OnClickListener listener)
// items标识字符串数据的资源ID
public Builder setItems(@ArrayRes int itemsId, final OnClickListener listener)


第二个参数 为 DialogInterface.OnClickListener类型。

  new AlertDialog.Builder(this)
                .setIcon(R.drawable.flag_mark_gray)
                .setTitle("请选择省份")
                .setItems(proviences, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 选择后的提示信息  记得调用show方法,否则不显示啦
                        final AlertDialog alertDialog = new AlertDialog.Builder(DialogDemoListAct.this)
                                .setMessage("选择了" + proviences[which])
                                .show();
                        // 设置定时器,5秒后,关闭AlertDialog
                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() { //  alertDialog.cancel(); 也可以
                                alertDialog.dismiss();
                            }
                        }, 5 * 1000);
                    }
                })
                .show();


在DialogInterface接口中有两个用于关闭对话框的方法:dismiss 和 cancel,这两个方法的功能完全相同,都是关闭对话框。


单选列表对话框-setSingleChoiceItems

通过AlertDialog.Builder类的setSingleChoiceItems方法可以创建带有单选按钮的列表对话框。setSingleChoiceItems有4个重载形式:

// 从字符串数组中装载数据
public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener) 
// 从资源文件中装载数据
public Builder setSingleChoiceItems(@ArrayRes int itemsId, int checkedItem,
                final OnClickListener listener) 
// 从ListAdapter中装载数据
public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener) 
// 从数据集中装载数据
public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,
                final OnClickListener listener) 


参数解释:


第一个参数:表示单选列表对话框的数据源,目前支持4种数据源,分别是 数据资源、数据集、字符串数组和ListAdapter对象

checkedItem:表示默认选中的列表项。如果设置第一个列表项为选中状态,该参数值为0 。 如果该值小于0,表示所有的列表项都未被选中。

listener: 单击某个列表项被触发的事件对象

lableColumn:如果数据源是数据集Cursor,数据集中的某一列作为列表对话框的数据加载到列表控件中。该参数表示该列的名称(字段名)


image.png


  // 用于保存当前列表项索引
  private int index;
  final String[] proviences = {"北京", "上海", "广州", "深圳", "纽约", "华盛顿", "拉斯维加斯"};
  new AlertDialog.Builder(this)
                .setIcon(R.drawable.flag_mark_violet)
                .setTitle("选择省份")
                .setSingleChoiceItems(proviences, -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(DialogDemoListAct.this)
                                // 使用index
                                .setMessage(index + " " + proviences[index])
                                .show();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        new AlertDialog.Builder(DialogDemoListAct.this)
                                .setMessage("您没有选择")
                                .show();
                    }
                })
                .show();


多选列表对话框-setMultiChoiceItems


通过AlertDialog.Builder.setMultiChoiceItems方法可以创建带复选框的列表对话框。

setMultiChoiceItems有3个重载方法


// 从资源文件中装载数据
public Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems,
                final OnMultiChoiceClickListener listener)
// 从字符串数组中装载数据
public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,
                final OnMultiChoiceClickListener listener) 
// 从数据集中装载数据
public Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,
                final OnMultiChoiceClickListener listener) 

参数解释:


第一个参数表示多选列表对话框的数据源,目前支持3种数据源:数组资源、数据集和字符串数组

checkedItems:该参数的数据类型为boolean[],这个参数值的长度要和列表框中的列表项个数相同,该参数用于设置每一个列表项的默认值,默认为true,表示当前的列表项是选中状态,否则表示未选中状态

listener:表示选中某一哥列表项时被触发的事件对象

isCheckedColumn:该参数只用于数据集Cursor数据源,用于指定数据集的一列(字段名);如果为0,则未被选中。也就是说,对于数据集来说,某个列表项是否被选中,是有另外一列的字段值决定的。

labelColumn:只用于数据集。指定用于显示列表项的列的字段名。


image.png

  // 多选对话框中的数据lv
    private ListView lv;
        AlertDialog ad = new AlertDialog.Builder(this)
                .setIcon(R.drawable.tag_red)
                .setTitle("选择省份")
                .setMultiChoiceItems(proviences,
                        new boolean[]{false, false, false, false, false, false, false},
                        new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                            }
                        })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        int count = lv.getCount();
                        String s = "您选择了:";
                        // 遍历
                        for (int i = 0; i < proviences.length; i++) {
                            if (lv.getCheckedItemPositions().get(i)) {
                                s += i + ":" + lv.getAdapter().getItem(i) + " ";
                            }
                        }
                        // 判断数量
                        if (lv.getCheckedItemPositions().size() > 0) {
                            new AlertDialog.Builder(DialogDemoListAct.this).setMessage(s).show();
                        } else {
                            new AlertDialog.Builder(DialogDemoListAct.this).setMessage("Nothing selected").show();
                        }
                    }
                })
                .setNegativeButton("取消", null)
                .create();
        // 获取lv
        lv = ad.getListView();
        // 显示AlertDialog ,show为异步方法,执行后,会继续执行下面的代码,在这里需要在最后调用
        ad.show();


注意事项:


必须指定setMulitChoiceItems方法的单击事件对象,也就是改方法的第三个参数,该参数不能设置为null,否则默认被选中的列表项无法置成未选中状态。对于默认未被选中的列表项没有任何影响。

由于存在“确定”按钮的单击事件中需要引用AlertDialog变量,因此先使用create方法返回AlertDialog对象,然后在单击事件中使用该变量

相关文章
|
5月前
|
XML 消息中间件 Android开发
信息提醒之对话框(AlertDialog + ProgressDialog)-更新中
信息提醒之对话框(AlertDialog + ProgressDialog)-更新中
56 0
|
5月前
|
Android开发
Android Studio APP开发入门之对话框Dialog的讲解及使用(附源码 包括提醒对话框,日期对话框,时间对话框)
Android Studio APP开发入门之对话框Dialog的讲解及使用(附源码 包括提醒对话框,日期对话框,时间对话框)
74 0
|
5月前
ProgressDialog.show进度对话框不显示
ProgressDialog.show进度对话框不显示
50 4
|
Android开发
Android 中ProgressDialog进度条对话框的使用(使用子线程模拟更新进度)
Android 中ProgressDialog进度条对话框的使用(使用子线程模拟更新进度)
161 0
|
Android开发
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
|
消息中间件
信息提醒之对话框(AlertDialog + ProgressDialog)-更新中(下)
信息提醒之对话框(AlertDialog + ProgressDialog)-更新中(下)
97 0
信息提醒之Toast-更新中
信息提醒之Toast-更新中
81 0
|
Android开发
Bug日志(四)——Android 防止多次点击(另解决多个列表子项点击)
在用户使用 应用的时候,经常会出现点击过快且多次点击同一控件的情况, 一方面这是因为应用或手机当前有些卡顿,网络卡啥的 另一方面也可能是由于很多应用并没有设置按钮点击时的 selector 或者其它按钮响应方式(例如点击按钮时按钮放大,常见于游戏),导致用户误认为没有点击到当前按钮。(比如使用selector再点击后更换背景颜色,图片等等)
|
Android开发 iOS开发
Android点击EditText文本框之外任何地方隐藏键盘的解决办法
1,实现方法一:通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏   加上id和clickable=true   然后在onCreate里,添加onClick事件的监听: @Overri...
889 0