dialog

Activities提供了一種方便管理的創建、保存、回覆的對話框機制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用這些方法的話,Activity將通過getOwnerActivity()方法返回該Activity管理的對話框(dialog).

 

  onCreateDialog(int):當你使用這個回調函數時,Android系統會有效的設置這個Activity爲每個對話框的所有者,從而自動管理每個對話框的狀態並掛靠到Activity上。這樣,每個對話框繼承這個Activity的特定屬性。比如,當一個對話框打開時,菜單鍵顯示爲這個Activity定義的選項菜單,音量鍵修改Activity使用的音頻流。

 

  showDialog(int): 當你想要顯示一個對話框時,調用showDialog(int id) 方法並傳遞一個唯一標識這個對話框的整數。當對話框第一次被請求時,Android從你的Activity中調用onCreateDialog(int id),你應該在這裏初始化這個對話框Dialog。這個回調方法被傳以和showDialog(int id)相同的ID。當你創建這個對話框後,在Activity的最後返回這個對象。

 

  onPrepareDialog(int, Dialog):在對話框被顯示之前,Android還調用了可選的回調函數onPrepareDialog(int id, Dialog). 如果你想在每一次對話框被打開時改變它的任何屬性,你可以定義這個方法。這個方法在每次打開對話框時被調用,而onCreateDialog(int) 僅在對話框第一次打開時被調用。如果你不定義onPrepareDialog(),那麼這個對話框將保持和上次打開時一樣。這個方法也被傳遞以對話框的ID,和在onCreateDialog()中創建的對話框對象。

 

  dismissDialog(int):當你準備關閉對話框時,你可以通過對這個對話框調用dismiss()來消除它。如果需要,你還可以從這個Activity中調用dismissDialog(int id) 方法,這實際上將爲你對這個對話框調用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法來管理你對話框的狀態(就如同在前面的章節討論的那樣),然後每次你的對話框消除的時候,這個對話框對象的狀態將由該Activity保留。如果你決定不再需要這個對象或者清除該狀態是重要的,那麼你應該調用removeDialog(int id)。這將刪除任何內部對象引用而且如果這個對話框正在顯示,它將被消除。

 

下面是幾種對話框的效果

圖1

圖2

圖3

圖4

圖5

圖6

圖7

  圖1效果:該效果是當按返回按鈕時彈出一個提示,來確保無誤操作,採用常見的對話框樣式。

     代碼:

  創建對話框方法dialog()

protected void dialog() {
  AlertDialog.Builder builder = new Builder(Main.this);
  builder.setMessage("確認退出嗎?");

  builder.setTitle("提示");

  builder.setPositiveButton("確認", new OnClickListener() {

   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();

    Main.this.finish();
   }
  });

  builder.setNegativeButton("取消", new OnClickListener() {

   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
   }
  });

  builder.create().show();
 }

 

在onKeyDown(int keyCode, KeyEvent event)方法中調用此方法

public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
   dialog();
  }
  return false;
 }

  圖2效果:改變了對話框的圖表,添加了三個按鈕

Dialog dialog = new AlertDialog.Builder(this).setIcon(
     android.R.drawable.btn_star).setTitle("喜好調查").setMessage(
     "你喜歡李連杰的電影嗎?").setPositiveButton("很喜歡",
     new OnClickListener() {

      @Override
      public void onClick(DialogInterface dialog, int which) {
       // TODO Auto-generated method stub
       Toast.makeText(Main.this, "我很喜歡他的電影。",
         Toast.LENGTH_LONG).show();
      }
     }).setNegativeButton("不喜歡", new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
     // TODO Auto-generated method stub
     Toast.makeText(Main.this, "我不喜歡他的電影。", Toast.LENGTH_LONG)
       .show();
    }
   }).setNeutralButton("一般", new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
     // TODO Auto-generated method stub
     Toast.makeText(Main.this, "談不上喜歡不喜歡。", Toast.LENGTH_LONG)
       .show();
    }
   }).create();

   dialog.show();

 

圖3效果:信息內容是一個簡單的View類型

new AlertDialog.Builder(this).setTitle("請輸入").setIcon(
     android.R.drawable.ic_dialog_info).setView(
     new EditText(this)).setPositiveButton("確定", null)
     .setNegativeButton("取消", null).show();

 

圖4效果:信息內容是一組單選框

new AlertDialog.Builder(this).setTitle("複選框").setMultiChoiceItems(
     new String[] { "Item1", "Item2" }, null, null)
     .setPositiveButton("確定", null)
     .setNegativeButton("取消", null).show();

 

圖5效果:信息內容是一組多選框

new AlertDialog.Builder(this).setTitle("單選框").setIcon(
     android.R.drawable.ic_dialog_info).setSingleChoiceItems(
     new String[] { "Item1", "Item2" }, 0,
     new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int which) {
       dialog.dismiss();
      }
     }).setNegativeButton("取消", null).show();

 

圖6效果:信息內容是一組簡單列表項

new AlertDialog.Builder(this).setTitle("列表框").setItems(
     new String[] { "Item1", "Item2" }, null).setNegativeButton(
     "確定", null).show();

 

圖7效果:信息內容是一個自定義的佈局

1.佈局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_height="wrap_content" android:layout_width="wrap_content"
 android:background="#ffffffff" android:orientation="horizontal"
 android:id="@+id/dialog">
 <TextView android:layout_height="wrap_content"
   android:layout_width="wrap_content"
  android:id="@+id/tvname" android:text="姓名:" />
 <EditText android:layout_height="wrap_content"
  android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/>

</LinearLayout>

2.調用代碼

LayoutInflater inflater = getLayoutInflater();
   View layout = inflater.inflate(R.layout.dialog,
     (ViewGroup) findViewById(R.id.dialog));

   new AlertDialog.Builder(this).setTitle("自定義佈局").setView(layout)
     .setPositiveButton("確定", null)
     .setNegativeButton("取消", null).show();

 

 

 

 

 

 

摘要: 創建對話框 一個對話框一般是一個出現在當前Activity之上的一個小窗口. 處於下面的Activity失去焦點, 對話框接受所有的用戶交互. 對話框一般用於提示信息和與當前應用程序直接相關的小功能.Android API 支持下列類型 ...
創建對話框
  一個對話框一般是一個出現在當前Activity之上的一個小窗口. 處於下面的Activity失去焦點, 對話框接受所有的用戶交互. 對話框一般用於提示信息和與當前應用程序直接相關的小功能.
  Android API 支持下列類型的對話框對象:
  警告對話框 AlertDialog:  一個可以有0到3個按鈕, 一個單選框或複選框的列表的對話框. 警告對話框可以創建大多數的交互界面, 是推薦的類型.
  進度對話框 ProgressDialog:  顯示一個進度環或者一個進度條. 由於它是AlertDialog的擴展, 所以它也支持按鈕.
  日期選擇對話框 DatePickerDialog:  讓用戶選擇一個日期.
  時間選擇對話框 TimePickerDialog:  讓用戶選擇一個時間.
  如果你希望自定義你的對話框, 可以擴展Dialog類.
  Showing a Dialog 顯示對話框
  一個對話框總是被創建和顯示爲一個Activity的一部分. 你應該在Activity的onCreateDialog(int)中創建對話框. 當你使用這個回調函數時,Android系統自動管理每個對話框的狀態並將它們和Activity連接, 將Activity變爲對話框的"所有者". 這樣,每個對話框從Activity繼承一些屬性. 例如,當一個對話框打開時, MENU鍵會顯示Activity的菜單, 音量鍵會調整Activity當前使用的音頻流的音量.
  注意: 如果你希望在onCreateDialog()方法之外創建對話框, 它將不會依附在Activity上. 你可以使用setOwnerActivity(Activity)來將它依附在Activity上.
  當你希望顯示一個對話框時, 調用showDialog(int)並將對話框的id傳給它.
  當一個對話框第一次被請求時,Android調用onCreateDialog(int). 這裏是你初始化對話框的地方. 這個回調函數傳入的id和showDialog(int)相同. 創建對話框之後,將返回被創建的對象.
  在對話框被顯示之前,Android還會調用onPrepareDialog(int, Dialog). 如果你希望每次顯示對話框時有動態更改的內容, 那麼就改寫這個函數. 該函數在每次一個對話框打開時都調用. 如果你不定義該函數,則對話框每次打開都是一樣的. 該函數也會傳入對話框的id以及你在onCreateDialog()中創建的Dialog對象.
  最好的定義onCreateDialog(int) 和onPrepareDialog(int, Dialog) 的方法就是使用一個switch語句來檢查傳入的id. 每個case創建相應的對話框. 例如, 一個遊戲使用兩個對話框: 一個來指示遊戲暫停,另一個指示遊戲結束. 首先, 爲它們定義ID:static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1; 
然後, 在onCreateDialog(int)中加入一個switch語句:
  1. protected Dialog onCreateDialog(int id) {  
  2.     Dialog dialog;  
  3.     switch(id) {  
  4.     case DIALOG_PAUSED_ID:  
  5.         // do the work to define the pause Dialog  
  6.         break;  
  7.     case DIALOG_GAMEOVER_ID:  
  8.         // do the work to define the game over Dialog  
  9.         break;  
  10.     default:  
  11.         dialog = null;  
  12.     }  
  13.     return dialog;  
  14. }   
  注意: 在這個例子中, case語句爲空因爲定義Dialog的程序在後面會有介紹.
  在需要顯示對話框是, 調用showDialog(int), 傳入對話框的id:
  showDialog(DIALOG_PAUSED_ID);Dismissing a Dialog 解除對話框
  當你準備關閉對話框時, 你可以使用dismiss()函數. 如果需要的話, 你也可以從Activity調用dismissDialog(int), 二者效果是一樣的.
  如果你使用onCreateDialog(int)來管理你的對話框的狀態, 那麼每次你的對話框被解除時, 該對話框對象的狀態會被Activity保存. 如果你決定你不再需要這個對象或者需要清除對話框的狀態, 那麼你應該調用 removeDialog(int). 這將把所有該對象的內部引用移除, 如果該對話框在顯示的話將被解除.
  Using dismiss listeners 使用解除監聽器
  如果你希望在對話框解除時運行某些程序, 那麼你應該給對話框附加一個解除監聽器.
  首先定義DialogInterface.OnDismissListener接口. 這個接口只有一個方法, onDismiss(DialogInterface), 該方法將在對話框解除時被調用.
  然後將你的OnDismissListener實現傳給setOnDismissListener().
  然而,注意對話框也可以被"取消". 這是一個特殊的情形, 它意味着對話框被用戶顯式的取消掉. 這將在用戶按下"back"鍵時, 或者對話框顯式的調用cancel()(按下對話框的cancel按鈕)時發生. 當一個對話框被取消時, OnDismissListener將仍然被通知, 但如果你希望在對話框被顯示取消(而不是正常解除)時被通知, 則你應該使用setOnCancelListener()註冊一個DialogInterface.OnCancelListener.
  Creating an AlertDialog 創建警告對話框
  An AlertDialog is an extension of the Dialog class. It is capable of constructing most dialog user interfaces and is the suggested dialog type. You should use it for dialogs that use any of the following features:
  一個警告對話框是對話框的一個擴展. 它能夠創建大多數對話框用戶界面並且是推薦的對話框類新星. 對於需要下列任何特性的對話框,你都應該使用它:
  一個標題
  一條文字消息
  1個-3個按鈕
  一個可選擇的列表(單選框或者複選框)
  要創建一個AlertDialog, 使用AlertDialog.Builder子類. 使用AlertDialog.Builder(Context)來得到一個Builder, 然後使用該類的公有方法來定義AlertDialog的屬性. 設定好以後, 使用create()方法來獲得AlertDialog對象.
  下面的主題展示瞭如何爲AlertDialog定義不同的屬性, 使用AlertDialog.Builder類. 如果你使用這些示例代碼, 你可以在onCreateDialog()中返回最後的Dialog對象來獲得圖片中對話框的效果.
  Adding buttons 增加按鈕
要創建一個如圖所示的窗口, 使用set...Button()方法:
  1. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  2. builder.setMessage("Are you sure you want to exit?")  
  3.        .setCancelable(false)  
  4.        .setPositiveButton("Yes"new DialogInterface.OnClickListener() {  
  5.            public void onClick(DialogInterface dialog, int id) {  
  6.                 MyActivity.this.finish();  
  7.            }  
  8.        })  
  9.        .setNegativeButton("No"new DialogInterface.OnClickListener() {  
  10.            public void onClick(DialogInterface dialog, int id) {  
  11.                 dialog.cancel();  
  12.            }  
  13.        });  
  14. AlertDialog alert = builder.create();  
首先,使用setMessage(CharSequence)爲對話框增加一條消息。 然後, 開始連續調用方法, 使用setCancelable(boolean)將對話框設爲不可取消(不能使用back鍵來取消)。對每一個按鈕,使用set...Button()方法,該方法接受按鈕名稱和一個DialogInterface.OnClickListener,該監聽器定義了當用戶選擇該按鈕時應做的動作。
  注意:對每種按鈕類型,只能爲AlertDialog創建一個。也就是說,一個AlertDialog不能有兩個以上的"positive"按鈕。這使得可能的按鈕數量最多爲三個:肯定、否定、中性。這些名字和實際功能沒有聯繫,但是將幫助你記憶它們各做什麼事情。
Adding a list 增加列表
要創建一個具有可選項的AlertDialog,使用setItems()方法:
  1. final CharSequence[] items = {"Red""Green""Blue"};   
  2. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  3. builder.setTitle("Pick a color");  
  4. builder.setItems(items, new DialogInterface.OnClickListener() {  
  5.     public void onClick(DialogInterface dialog, int item) {  
  6.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();  
  7.     }  
  8. });  
  9. AlertDialog alert = builder.create();  
首先增加一個標題。然後使用setItems()增加一個可選列表,該列表接受一個選項名稱的列表和一個DialogInterface.OnClickListener, 後者定義了選項對應的響應。

Adding checkboxes and radio buttons 增加單選框和複選框
 
要創建一個帶有多選列表或者單選列表的對話框, 使用setMultiChoiceItems()和setSingleChoiceItems()方法。如果你在onCreateDialog()中創建可選擇列表, Android會自動管理列表的狀態. 只要activity仍然活躍, 那麼對話框就會記住剛纔選中的選項,但當用戶退出activity時,該選擇丟失。
  注意: 要在你的acitivity離開和暫停時保存選擇, 你必須在activity的聲明週期中正確的保存和恢復設置。爲了永久性保存選擇,你必須使用數據存儲技術中的一種。
  要創建一個具有單選列表的AlertDialog,只需將一個例子中的setItems()換成 setSingleChoiceItems():
  1. final CharSequence[] items = {"Red""Green""Blue"};   
  2. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  3. builder.setTitle("Pick a color");  
  4. builder.setSingleChoiceItems(items, -1new DialogInterface.OnClickListener() {  
  5.     public void onClick(DialogInterface dialog, int item) {  
  6.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();  
  7.     }  
  8. });  
  9. AlertDialog alert = builder.create();  
第二個參數是默認被選中的選項位置,使用“-1”來表示默認情況下不選中任何選項。

Creating a ProgressDialog 創建進度對話框
一個ProgressDialog(進度對話框)是AlertDialog的擴展。它可以顯示一個進度的動畫――進度環或者進度條。這個對話框也可以提供按鈕,例如取消一個下載等。
  打開一個進度對話框很簡單,只需要調用 ProgressDialog.show()即可。例如,上圖的對話框可以不通過onCreateDialog(int),而直接顯示:
  ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
  "Loading. Please wait...", true);
  第一個參數是應用程序上下文。第二個爲對話框的標題(這裏爲空),第三個爲對話框內容, 最後一個爲該進度是否爲不可確定的(這隻跟進度條的創建有關,見下一節)。
  進度對話框的默認樣式爲一個旋轉的環。如果你希望顯示進度值,請看下一節。
  Showing a progress bar 顯示進度條
  使用一個動畫進度條來顯示進度:
  使用 ProgressDialog(Context)構造函數來初始化一個ProgressDialog對象。
  將進度樣式設置爲"STYLE_HORIZONTAL",使用setProgressStyle(int)方法。並且設置其它屬性,例如內容等。
  在需要顯示時調用show()或者從onCreateDialog(int)回調函數中返回該ProgressDialog。
  你可以使用 setProgress(int)或者incrementProgressBy(int)來增加顯示的進度。
  例如,你的設置可能像這樣:ProgressDialog progressDialog;
progressDialog = new ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
  設置很簡單。大部分創建進度對話框需要的代碼是在更新它的進程中。你可能需要在一個新的線程中更新它,並使用Handler來將進度報告給Activity。如果你不熟悉使用Handler和另外的線程,請看下列例子,該例子使用了一個新的線程來更新進度。
  Example ProgressDialog with a second thread 例--使用一個線程來顯示進度對話框
  這個例子使用一個線程來跟蹤一個進程的進度(其實爲從1數到100)。每當進度更新時,該線程通過Handler給主activity發送一個消息。主Activity更新ProgressDialog.package com.example.progressdialog;
  1. import android.app.Activity;  
  2. import android.app.Dialog;  
  3. import android.app.ProgressDialog;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. public class NotificationTest extends Activity {  
  11.     static final int PROGRESS_DIALOG = 0;  
  12.     Button button;  
  13.     ProgressThread progressThread;  
  14.     ProgressDialog progressDialog;  
  15.     /** Called when the activity is first created. */  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);   
  19.         // Setup the button that starts the progress dialog  
  20.         button = (Button) findViewById(R.id.progressDialog);  
  21.         button.setOnClickListener(new OnClickListener(){  
  22.             public void onClick(View v) {  
  23.                 showDialog(PROGRESS_DIALOG);  
  24.             }  
  25.         });  
  26.     }  
  27.     protected Dialog onCreateDialog(int id) {  
  28.         switch(id) {  
  29.         case PROGRESS_DIALOG:  
  30.             progressDialog = new ProgressDialog(NotificationTest.this);  
  31.             progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  32.             progressDialog.setMessage("Loading...");  
  33.             progressThread = new ProgressThread(handler);  
  34.             progressThread.start();  
  35.             return progressDialog;  
  36.         default:  
  37.             return null;  
  38.         }  
  39.     }   
  40.     // Define the Handler that receives messages from the thread and update the progress  
  41.     final Handler handler = new Handler() {  
  42.         public void handleMessage(Message msg) {  
  43.             int total = msg.getData().getInt("total");  
  44.             progressDialog.setProgress(total);  
  45.             if (total >= 100){  
  46.                 dismissDialog(PROGRESS_DIALOG);  
  47.                 progressThread.setState(ProgressThread.STATE_DONE);  
  48.             }  
  49.         }  
  50.     };   
  51.     /** Nested class that performs progress calculations (counting) */  
  52.     private class ProgressThread extends Thread {  
  53.         Handler mHandler;  
  54.         final static int STATE_DONE = 0;  
  55.         final static int STATE_RUNNING = 1;  
  56.         int mState;  
  57.         int total;  
  58.         ProgressThread(Handler h) {  
  59.             mHandler = h;  
  60.         }  
  61.         public void run() {  
  62.             mState = STATE_RUNNING;     
  63.             total = 0;  
  64.             while (mState == STATE_RUNNING) {  
  65.                 try {  
  66.                     Thread.sleep(100);  
  67.                 } catch (InterruptedException e) {  
  68.                     Log.e("ERROR""Thread Interrupted");  
  69.                 }  
  70.                 Message msg = mHandler.obtainMessage();  
  71.                 Bundle b = new Bundle();  
  72.                 b.putInt("total", total);  
  73.                 msg.setData(b);  
  74.                 mHandler.sendMessage(msg);  
  75.                 total++;  
  76.             }  
  77.         }  
  78.         /* sets the current state for the thread, 
  79.          * used to stop the thread */  
  80.         public void setState(int state) {  
  81.             mState = state;  
  82.         }  
  83.     }  
  84. }  
Creating a Custom Dialog 創建自定義對話框
如果你想自定義一個對話框,你可以使用佈局元素來創造你的對話框的佈局。定義好佈局後,將根View對象或者佈局資源ID傳給setContentView(View).
例如,創建如圖所示的對話框:
創建一個xml佈局custom_dialog.xml:
  1. http://schemas.android.com/apk/res/android"  
  2.               android:id="@+id/layout_root"  
  3.               android:orientation="horizontal"  
  4.               android:layout_width="fill_parent"  
  5.               android:layout_height="fill_parent"  
  6.               android:padding="10dp"  
  7.               >  
  8.                    android:layout_width="wrap_content"  
  9.                android:layout_height="fill_parent"  
  10.                android:layout_marginRight="10dp"  
  11.                />  
  12.                   android:layout_width="wrap_content"  
  13.               android:layout_height="fill_parent"  
  14.               android:textColor="#FFF"  
  15.               />  
該xml定義了一個LinearLayout中的一個ImageView 和一個TextView。
將以上佈局設爲對話框的content view,並且定義ImageView 和 TextView的內容:
  1. Context mContext = getApplicationContext();  
  2. Dialog dialog = new Dialog(mContext);   
  3. dialog.setContentView(R.layout.custom_dialog);  
  4. dialog.setTitle("Custom Dialog");  
  5. TextView text = (TextView) dialog.findViewById(R.id.text);  
  6. text.setText("Hello, this is a custom dialog!");  
  7. ImageView p_w_picpath = (ImageView) dialog.findViewById(R.id.p_w_picpath);  
  8. p_w_picpath.setImageResource(R.drawable.android);  
在初始化Dialog之後,使用setContentView(int),將佈局資源id傳給它。現在Dialog有一個定義好的佈局,你可以使用findViewById(int)來找到該元素的id並修改它的內容。
  使用前面所講的方法顯示對話框。
  一個使用Dialog類建立的對話框必須有一個標題。如果你不調用setTitle(),那麼標題區域會保留空白。如果你不希望有一個標題,那麼你應該使用AlertDialog類來創建自定義對話框。然而,由於一個AlertDialog使用AlertDialog.Builder類來建立最方便,所以你沒有方法使用setContentView(int),而是隻能使用setView(View)。該方法接受一個View對象,所以你需要從xml中展開你的根View。
  要展開一個xml佈局,使用 getLayoutInflater() (或 getSystemService())取得LayoutInflater,然後調用inflate(int, ViewGroup),第一個參數爲佈局id,而第二個參數爲根view的id。現在,你可以使用展開後的佈局來找到View對象並定義ImageView和TextView元素的內容。然後實例化AlertDialog.Builder並使用setView(View)來爲對話框設置展開後的佈局。例如:
  1. AlertDialog.Builder builder;  
  2. AlertDialog alertDialog;   
  3. Context mContext = getApplicationContext();  
  4. LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);  
  5. View layout = inflater.inflate(R.layout.custom_dialog,  
  6.                                (ViewGroup) findViewById(R.id.layout_root));  
  7. TextView text = (TextView) layout.findViewById(R.id.text);  
  8. text.setText("Hello, this is a custom dialog!");  
  9. ImageView p_w_picpath = (ImageView) layout.findViewById(R.id.p_w_picpath);  
  10. p_w_picpath.setImageResource(R.drawable.android);  
  11. builder = new AlertDialog.Builder(mContext);  
  12. builder.setView(layout);  
  13. alertDialog = builder.create();  
使用AlertDialog來自定義對話框,可以利用其內置特性例如按鈕、選擇列表、標題、圖標等。


顯示對話框

    對話框經常作爲Activity的一部分來創建和顯示。你通常應該從protected Dialog Activity.onCreateDialog (int id) 回調方法裏創建對話框。當你使用這個回調函數時,Android系統會有效的設置這個Activity爲每個對話框的所有者,從而自動管理每個對話框的狀態並掛靠到Activity上。這樣,每個對話框繼承這個Activity的特定屬性。比如,當一個對話框打開時,菜單鍵顯示爲這個Activity定義的選項菜單,音量鍵修改Activity使用的音頻流

  1. 注意: 如果你決定在onCreateDialog()方法之外創建一個對話框,它將不會被附着到活動上。不過,你可以通過setOwnerActivity(Activity)把它附着到一個活動上。 

    當你想要顯示一個對話框時,調用showDialog(int id) 方法並傳遞一個唯一標識這個對話框的整數。

    當對話框第一次被請求時,Android從你的Activity中調用onCreateDialog(int id),你應該在這裏初始化這個對話框Dialog。這個回調方法被傳以和showDialog(int id)相同的ID。當你創建這個對話框後,在Activity的最後返回這個對象。

    在對話框被顯示之前,Android還調用了可選的回調函數onPrepareDialog(int id, Dialog). 如果你想在每一次對話框被打開時改變它的任何屬性,你可以定義這個方法。這個方法在每次打開對話框時被調用,而onCreateDialog(int) 僅在對話框第一次打開時被調用如果你不定義onPrepareDialog(),那麼這個對話框將保持和上次打開時一樣。這個方法也被傳遞以對話框的ID,和在onCreateDialog()中創建的對話框對象。(個人理解是,在本Activity裏第一次show某個Dialog,則先調用onCreateDialog,得到返回的Dialog對象並掛靠在Activity,保存Dialog對象的引用,然後才顯示Dialog。這樣子,下次再show Dialog就不用重新創建Dialog對象,而是重用舊的)

    定義onCreateDialog(int) 和 onPrepareDialog(int, Dialog) 回調函數的最佳方法是使用一個switch 語句來檢查傳遞進來的id 參數。每個case 應該檢查一個唯一的對話框ID然後創建和定義相應的對話框。比如,想象一下一個遊戲使用兩個不同的對話框:一個用來指示這個遊戲已經暫停而另一個來指示遊戲結束。首先,爲每個對話框定義一個常量:

  1. static final int DIALOG_PAUSED_ID = 0
  2. static final int DIALOG_GAMEOVER_ID = 1

然後,爲每一個ID用一個switch case定義這個onCreateDialog(int) 回調函數:

  1. protected Dialog onCreateDialog(int id) { 
  2.     Dialog dialog; 
  3.     switch(id) { 
  4.     case DIALOG_PAUSED_ID: 
  5.         // do the work to define the pause Dialog 
  6.         break
  7.     case DIALOG_GAMEOVER_ID: 
  8.         // do the work to define the game over Dialog 
  9.         break
  10.     default
  11.         dialog = null
  12.     } 
  13.     return dialog; 

當是時候顯示其中之一的對話框時,使用對話框ID調用showDialog(int):

  1. showDialog(DIALOG_PAUSED_ID); 
 

消除對話框Dismissing a Dialog

    當你準備關閉對話框時,你可以通過對這個對話框調用dismiss()來消除它。如果需要,你還可以從這個Activity中調用dismissDialog(int id) 方法,這實際上將爲你對這個對話框調用dismiss() 方法。

    如果你想使用onCreateDialog(int id) 方法來管理你對話框的狀態(就如同在前面的章節討論的那樣),然後每次你的對話框消除的時候,這個對話框對象的狀態將由該Activity保留。如果你決定不再需要這個對象或者清除該狀態是重要的,那麼你應該調用removeDialog(int id)。這將刪除任何內部對象引用而且如果這個對話框正在顯示,它將被消除。

 

使用消除偵聽器Using dismiss listeners

    如果你希望你的應用程序在一個對話框消亡的時候執行一些流程,那麼你應該附着一個on-dismiss偵聽器到對話框上。

  1. @Override 
  2. protected void onPrepareDialog(int id, Dialog dialog) { 
  3.     switch(id){ 
  4.     case PROGRESS_DIALOG: 
  5.         dialog.setOnDismissListener(new DialogInterface.OnDismissListener()
  6.             @Override 
  7.             public void onDismiss(DialogInterface dialog) { 
  8.                 Toast.makeText(getApplicationContext(), 
  9.                         "dismiss listener!"
  10.                         Toast.LENGTH_SHORT) 
  11.                 .show(); 
  12.             } 
  13.         }); 
  14.     } 

    然而, 請注意對話框也可以被“取消”。這是一個表明對話框被用戶顯示取消的特殊情況。這將在用戶按“返回”按鈕時發生,或者這個對話框顯示的調用cancel() (也許通過對話框上的一個“取消”按鈕)。當一個對話框被取消時,這個OnDismissListener 依然會被通知到,但是如果你希望在對話框被顯示取消時被通知到(而不是通常的消除方式),那麼你應該通過setOnCancelListener()註冊一個DialogInterface.OnCancelListener 

    目前個人學習發現,一般情況下,調用dialog.cancel()就會觸發onCancelLister。而點擊AlertDialog的NegativeButton (Cancel/No)是不會觸發的。對於setOnCancelListener()要注意的是,這裏有兩個setOnCancelListener(),但返回值不同:

  1. //AlertDialog.Builder調用的 
  2. public AlertDialog.Builder setOnCancelListener (DialogInterface.OnCancelListener onCancelListener) 
  3.  
  4. //Dialog調用的 
  5. public void setOnCancelListener (DialogInterface.OnCancelListener listener) 
 

警告對話框AlertDialog的使用

    爲了創建一個警告對話框,使用AlertDialog.Builder 子類。通過AlertDialog.Builder(Context)獲取一個構造器然後使用這個類的公共方法來定義警告對話框的所有屬性。當得到構造器後,通過create().方法來獲取警告對話框對象。有時我是不調用create()的,而是在設置好了後直接調用show()顯示AlertDialog。

Dialog_button Dialog_button Dialog_button

增加按鈕Adding buttons

    這就是我一開始很想知道的究竟如何添加Yes/No,Ok/Cancel這樣的按鈕。原來是通過setPositiveButton(...)響應Yes/Ok的點擊,setNeutralButton(...)響應中立行爲的點擊,setNegativeButton(...)響應No/Cancel的點擊。注意,只能各自設置一個按鈕來響應點擊事件。

  1. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  2. builder.setMessage("Are you sure you want to exit?"
  3.        .setCancelable(false
  4.        .setPositiveButton("Yes"new DialogInterface.OnClickListener() { 
  5.            public void onClick(DialogInterface dialog, int id) { 
  6.                 MyActivity.this.finish(); 
  7.            } 
  8.        }) 
  9.        .setNegativeButton("No"new DialogInterface.OnClickListener() { 
  10.            public void onClick(DialogInterface dialog, int id) { 
  11.                 dialog.cancel(); 
  12.            } 
  13.        }); 
  14. AlertDialog alert = builder.create(); 

    首先,爲這個對話框添加一個消息setMessage(CharSequence)。然後,開始函數鏈並設置該對話框爲不能取消not cancelable (因此用戶不能使用返回按鈕關閉這個對話框)。對每個按鈕,使用任一set...Button() 方法,比如setPositiveButton(),該方法接受按鈕名稱以及一個定義用戶選中按鈕後所採取動作的DialogInterface.OnClickListener

增加一個列表Adding a list
  1. final CharSequence[] items = {"Red""Green""Blue"}; 
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  4. builder.setTitle("Pick a color"); 
  5. builder.setItems(items, new DialogInterface.OnClickListener() { 
  6.     public void onClick(DialogInterface dialog, int item) { 
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
  8.     } 
  9. }); 
  10. AlertDialog alert = builder.create(); 

    首先,用setTitle(CharSequence)方法給對話框添加一個標題。然後,添加用setItems()添加一個可選項列表,該列表接受一組顯示的items和一個DialogInterface.OnClickListener 來定義用戶選中按鈕後所採取動作。

增加複選框和單選按鈕

    要在對話框裏創建一個多選項列表(checkboxes)或者單選項(radio buttons),可分別調用setMultiChoiceItems() 和setSingleChoiceItems() 方法。如果你在onCreateDialog()回調函數中創建這些可選列表,Android會幫你管理列表狀態。只要這個活動是激活的,對話框會記住之前選中的items,但如果用戶退出這個活動,用戶選擇將丟失。

    注意: 爲了在用戶離開或暫停這個活動的時候能夠保存選擇,你必須通過活動生命期Activity Lifecycle來恰當的保存和恢復設置。爲了永久保存選項,即使活動進程被完全終止,你需要使用數據存儲Data Storage技術。

  1. final CharSequence[] items = {"Red""Green""Blue"}; 
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
  4. builder.setTitle("Pick a color"); 
  5. builder.setSingleChoiceItems(items, -1new DialogInterface.OnClickListener() { 
  6.     public void onClick(DialogInterface dialog, int item) { 
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
  8.     } 
  9. }); 
  10. AlertDialog alert = builder.create(); 

    setSingleChoiceItems() 的第二個參數是一個checkedItem整型數值,指示了基於0的缺省選擇項的位置。“-1”代表不會有默認選擇項。

 

進度對話框Progress Dialog的使用

    ProgressDialogAlertDialog類的一個擴展,可以爲一個未定義進度的任務顯示一個旋轉輪形狀的進度動畫,或者爲一個指定進度的任務顯示一個進度條。

    可以簡單地通過調用ProgressDialog.show()方法來顯示一個進度對話框,而通過onCreateDialog(int)回調管理這個對話框是可選的,如下所示:

  1. ProgressDialog.show(this// context 
  2.     ""// title 
  3.     "Loading. Please wait..."// message 
  4.     true); //進度是否是不確定的,這隻和創建進度條有關 

進度對話框的缺省類型是一個旋轉輪,運行看到的是以下效果:

ProgressDialog

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章