android的Dialog相關

來源:互聯網
上載者:User

對話方塊經常作為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) 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.