對話方塊經常作為Activity的一部分來建立和顯示。你通常應該從protected Dialog Activity.onCreateDialog (int id) 回調方法裡建立對話方塊。當你使用這個回呼函數時,Android系統會有效設定這個Activity為每個對話方塊的所有者,從而自動管理每個對話方塊的狀態並掛靠到Activity上。這樣,每個對話方塊繼承這個Activity的特定屬性。比如,當一個對話方塊開啟時,菜單鍵顯示為這個Activity定義的選項菜單,音量鍵修改Activity使用的音頻流。
- 注意: 如果你決定在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然後建立和定義相應的對話方塊。比如,想象一下一個遊戲使用兩個不同的對話方塊:一個用來指示這個遊戲已經暫停而另一個來指示遊戲結束。首先,為每個對話方塊定義一個常量:
- static final int DIALOG_PAUSED_ID = 0;
- static final int DIALOG_GAMEOVER_ID = 1;
然後,為每一個ID用一個switch case定義這個onCreateDialog(int) 回呼函數:
- protected Dialog onCreateDialog(int id) {
- Dialog dialog;
- switch(id) {
- case DIALOG_PAUSED_ID:
- // do the work to define the pause Dialog
- break;
- case DIALOG_GAMEOVER_ID:
- // do the work to define the game over Dialog
- break;
- default:
- dialog = null;
- }
- return dialog;
- }
當是時候顯示其中之一的對話方塊時,使用對話方塊ID調用showDialog(int):
- 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接聽程式到對話方塊上。
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- switch(id){
- case PROGRESS_DIALOG:
- dialog.setOnDismissListener(new DialogInterface.OnDismissListener(){
- @Override
- public void onDismiss(DialogInterface dialog) {
- Toast.makeText(getApplicationContext(),
- "dismiss listener!",
- Toast.LENGTH_SHORT)
- .show();
- }
- });
- }
- }
然而, 請注意對話方塊也可以被“取消”。這是一個表明對話方塊被使用者顯示取消的特殊情況。這將在使用者按“返回”按鈕時發生,或者這個對話方塊顯示的調用cancel() (也許通過對話方塊上的一個“取消”按鈕)。當一個對話方塊被取消時,這個OnDismissListener 依然會被通知到,但是如果你希望在對話方塊被顯示取消時被通知到(而不是通常的消除方式),那麼你應該通過setOnCancelListener()註冊一個DialogInterface.OnCancelListener 。
目前個人學習發現,一般情況下,調用dialog.cancel()就會觸發onCancelLister。而點擊AlertDialog的NegativeButton (Cancel/No)是不會觸發的。對於setOnCancelListener()要注意的是,這裡有兩個setOnCancelListener(),但傳回值不同:
- //AlertDialog.Builder調用的
- public AlertDialog.Builder setOnCancelListener (DialogInterface.OnCancelListener onCancelListener)
-
- //Dialog調用的
- public void setOnCancelListener (DialogInterface.OnCancelListener listener)