在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();
上述代码实现了自定义对话框的功能,具体的注释也很清楚了,这里不再赘述。