Android dialog使用总结 - 火牛_KOP

时间:2024-03-12 17:35:42

Android dialog使用总结

       对话框就是用来在界面里弹出,让用户选择的窗口,一般都是 “半透明的背景 + 标题 + 内容说明 + 确认/取消” 这样的形式。对话框就是告诉用户一定要做一个操作才能往下进行,这个在官方文档里面叫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     }