对话框就是用来在界面里弹出,让用户选择的窗口,一般都是 “半透明的背景 + 标题 + 内容说明 + 确认/取消” 这样的形式。对话框就是告诉用户一定要做一个操作才能往下进行,这个在官方文档里面叫modal events(模态事件)。
下面总结一下Android下面对话框的使用。
一般常用的dialog
Android的dialog使用一般的流程是:
提示对话框AlertDialog
1、使用builder或者构造函数初始化
2、setTitle 、setMessage 设置dialog的内容
3、setPositiveButton(设置确认按钮的显示和按下的行为),setNegativeButton(设置取消按钮的显示和按下的行为),setNeutralButton(设置中性按钮的显示和按下的行为) 设置要显示的按钮和按钮相应的处理,setIcon可以设置标题旁边的图标显示的图片
4、调用Crete(),创建这个AlertDialog
4、调用show()显示对话框
1 AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("yes").setMessage("Are you sure ?").setIcon(R.drawable.ic_launcher); 2 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 3 4 @Override 5 public void onClick(DialogInterface dialog, int which) { 6 // TODO Auto-generated method stub 7 Log.d(TAG, "which = "+which+",DialogInterface.BUTTON_NEGATIVE="+DialogInterface.BUTTON_NEGATIVE); 8 } 9 }); 10 builder.setNeutralButton("帮助", new DialogInterface.OnClickListener() { 11 12 @Override 13 public void onClick(DialogInterface dialog, int which) { 14 // TODO Auto-generated method stub 15 Log.d(TAG, "which = "+which+",DialogInterface.BUTTON_NEUTRAL="+DialogInterface.BUTTON_NEUTRAL); 16 } 17 }); 18 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { 19 20 @Override 21 public void onClick(DialogInterface dialog, int which) { 22 // TODO Auto-generated method stub 23 Log.d(TAG, "which = "+which+",DialogInterface.BUTTON_POSITIVE="+DialogInterface.BUTTON_POSITIVE); 24 } 25 }); 26 27 AlertDialog ad = builder.create(); 28 ad.setCancelable(true); 29 ad.setCanceledOnTouchOutside(false); 30 ad.show();
还有两个解释的点1、ad.setCancelable(true)这个是指是否响应BACK键,然后关闭dialog ad.setCanceledOnTouchOutside(false)是指用户去摸dialog之外的空间是否关闭dialog
我现在做的项目一般就是这样设置的,至于默认这两个的值是true还是false,好像4.0的前后是有差别的,其实每次设置一下就好了。 2、这个可以每一个按键都new一个匿名类,或者几个按键几个dialog都使用一个 dialogDialogInterface.OnClickListener 因为onClick(DialogInterface dialog, int which)这个函数的两个入参够从来区分dialog和按键了
Alertdialog可以使用列表和adapter来作为单选或者多选的对话框,使用setAdapter()
1 AlertDialog.Builder build2 = new AlertDialog.Builder(this).setTitle("请选择喜欢球员").setIcon(R.drawable.ic_launcher); 2 build2.setAdapter(new ArrayAdapter<String>(this,R.layout.alert_item, new String[]{"大罗","小罗","c罗"}), new DialogInterface.OnClickListener() { 3 4 @Override 5 public void onClick(DialogInterface dialog, int which) { 6 // TODO Auto-generated method stub 7 Log.d(TAG, "which="+which); 8 } 9 }); 10 AlertDialog ad2 = build2.create(); 11 ad2.setCancelable(true); 12 ad2.setCanceledOnTouchOutside(false); 13 ad2.show();
R.layout.alert_item的内容就是一个textView
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/alert_item_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="14sp" android:padding="10dp" />
Alertdialog可以变成多选对话框,使用setMultiChoiceItems(或者setSingleChoiceItems变单选使用方式差不多)
1 AlertDialog.Builder build3 = new AlertDialog.Builder(this) 2 .setTitle("请选择你喜欢的水果(多选)").setIcon(R.drawable.ic_launcher); 3 // 第一个字符串数组是用来设置显示的选项列表,第二个boolean的数组是用来设置默认是否checked的选项 4 // 这个的回调onClick,有三个参数,多了一个checked的参数,作用不用多说 5 build3.setMultiChoiceItems(new String[] { "苹果", "香蕉", "梨" }, 6 new boolean[] { true, false, true }, 7 new DialogInterface.OnMultiChoiceClickListener() { 8 9 @Override 10 public void onClick(DialogInterface dialog, int which, 11 boolean isChecked) { 12 // TODO Auto-generated method stub 13 Log.d(TAG, "which=" + which + ",isChecked=" 14 + isChecked); 15 } 16 17 }); 18 build3.setNegativeButton("取消", 19 new DialogInterface.OnClickListener() { 20 21 @Override 22 public void onClick(DialogInterface dialog, int which) { 23 // TODO Auto-generated method stub 24 Log.d(TAG, "which = " + which 25 + ",DialogInterface.BUTTON_NEGATIVE=" 26 + DialogInterface.BUTTON_NEGATIVE); 27 } 28 }); 29 build3.setPositiveButton("确定", 30 new DialogInterface.OnClickListener() { 31 32 @Override 33 public void onClick(DialogInterface dialog, int which) { 34 // TODO Auto-generated method stub 35 Log.d(TAG, "which = " + which 36 + ",DialogInterface.BUTTON_POSITIVE=" 37 + DialogInterface.BUTTON_POSITIVE); 38 } 39 }); 40 AlertDialog ad3 = build3.create(); 41 ad3.setCancelable(true); 42 ad3.setCanceledOnTouchOutside(false); 43 ad3.show();
日期、时间 选择对话框DatePickerDialog、TimePickerDialog
1、使用初始化函数新建DatePickerDialog、TimePickerDialog
2、设置时间、日期设置处理函数
3、设置日期和时间,包括最大最小可选择的日期和时间
DatePickerDialog
1 Calendar ca = Calendar.getInstance(); 2 DatePickerDialog datePickerDialog = new DatePickerDialog(this, new OnDateSetListener() { 3 4 @Override 5 public void onDateSet(DatePicker view, int year, int monthOfYear, 6 int dayOfMonth) { 7 // TODO Auto-generated method stub 8 Log.d(TAG, "year="+year+",monthOfYear="+monthOfYear+",dayOfMonth="+dayOfMonth); 9 } 10 }, ca.get(Calendar.YEAR), ca.get(Calendar.MONTH), ca.get(Calendar.DAY_OF_MONTH)); 11 datePickerDialog.show();
TimePickerDialog
1 Calendar caTime = Calendar.getInstance(); 2 TimePickerDialog timePickerDialog = new TimePickerDialog(this, new OnTimeSetListener() { 3 4 @Override 5 public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 6 // TODO Auto-generated method stub 7 Log.d(TAG, "hourOfDay="+hourOfDay+",minute="+minute); 8 } 9 }, caTime.get(caTime.HOUR_OF_DAY), caTime.get(caTime.MINUTE), true); 10 timePickerDialog.show();
进度对话框progressDialog
ProgressDialog其实用法和其他dialog差不多,但是,下面的代码说的很清楚,ShowPbTask就是一个
1 //如果只是简单的显示一下进度条,直接就可以用ProgressDialog的静态类 2 //ProgressDialog.show(context, title, message); 3 mPd = new ProgressDialog(this); 4 // ProgressDialog.STYLE_SPINNER---就是转圈,要显示进度可以自己setMessgae去设置 5 // ProgressDialog.STYLE_HORIZONTAL---显示你setPorgess的值 6 //mPd.setProgressStyle(ProgressDialog.STYLE_SPINNER); 7 mPd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 8 mPd.setTitle("正在处理"); 9 //设置进度条显示的最大值 10 mPd.setMax(100); 11 mPd.setCancelable(true); 12 mPd.setCanceledOnTouchOutside(false); 13 mPd.show(); 14 // 一般progressDialog都会搭配一个后台的进程使用,下面的这个就是用AsyncTask来模拟一下更新的过程,更新使用mPd.setProgress或者setMessage来更新 15 mShowPbTask = new ShowPbTask(); 16 mShowPbTask.execute();
两种样式的progressdialog
自定义样式的dialog
1、自定义的layout,inflate成view
2、把这个view通过dialog的setview,设置到dialog中,至于按键的处理需要自己去设置onlicklistener来处理,和普通的控件处理出不多
3、show()
cancel和dismiss关闭dilaog
cancel和dismis都是用来关闭dialog的,那有啥区别呢:下面的代码来着Dialog.java,它的注释已经说的很清楚了
cancel也会调用dismiss,cancel会调用你定义的OnCancelListener(如果有通过setOnCancelListener注册过)
1 /** 2 * Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will 3 * also call your {@link DialogInterface.OnCancelListener} (if registered). 4 */ 5 public void cancel() { 6 if (!mCanceled && mCancelMessage != null) { 7 mCanceled = true; 8 // Obtain a new message so this dialog can be re-used 9 Message.obtain(mCancelMessage).sendToTarget(); 10 } 11 dismiss(); 12 }