對話框就是用來在界面里彈出,讓用戶選擇的窗口,一般都是 “半透明的背景 + 標題 + 內容說明 + 確認/取消” 這樣的形式。對話框就是告訴用戶一定要做一個操作才能往下進行,這個在官方文檔里面叫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 }

