由于对话框用的并不是很多,每次项目中需要的时候,都需要去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()出来。