星期日, 10月 02, 2011

Creating Dialogs

Android應用程式學習筆記

Creating Dialogs

對話框通城市小小的視窗,顯示在目前的activity面前,底層的activity失去焦點而對話框鳩收所有用戶的互動。對話框正常用途是通知,應該中斷用戶並執行簡短的直接與應用程式進展相關的任務(比如,進度條或者登入提示)。

Dialog類是創建對話框的基礎類,然而,通常不應該直接實現Dialog類,應該使用以下的子類的其中一個:
AlertDialog
可以管理零、一、二和三個按鈕,或者可選擇項目列表,包括checkboxs、radio buttons的對話框,AlertDialog有能力建構大部分的對話框的使用者介面並且也是被推薦的對話框類型。
ProgressDialog
顯示進度輪或是進度條的對話框。因為它是AlertDialog的延伸,所以它也支援按鈕的功能。
DatePickerDialog
 允許用戶選擇日期的對話框。
TimePickerDialog
允許用戶選擇時間的對話框。
如果你想要客製化自己的對話框,你可以繼承基礎Dialog物件或上述提到的子類來定義新的布局。


Showing a Dialog

對話框總是創建與顯示為activity的一部分,通常應該從Acitvity的onCreateDialog(int)回調方法創建對話框。當你使用該回調方法,Android系統會自動管理每個對話框的狀態並把它們掛在activity上,有效的使activity為對話框的"主人"。每個對話框從activity繼承一些特性,例如,當對話框打開時,菜單鍵揭示為activity產生的選擇菜單和音量鍵藉activity調整音頻。

當你想顯示對話框,呼叫showDialog(int)方法並傳入能唯一辨識你想顯示的對話框的整數。

當對話框被請求的第一時間,Android呼叫來自Activity的onCreateDialog(int),它是實現Dialog類的地方,該方法傳入的整數與你傳入showDialog(int)的整數是相同的。創建對話框之後,在方法最後回傳一個物件。

在對話框顯示之前,系統也會呼叫自選的回調方法onPrepareDialog(int , Dialog),如果你想要在每次打開對話框的時候改變任何對話框的特性,就要定義該方法。每次打開對話框就會呼叫該方法,而onCreateDialog(int)只會在對話框第一次打開的時候被呼叫。如果你不想定義onPrepareDialog(int , Dialog),對話框將維持與前一次打開的一樣,該方法傳入對話框的id和在onCreateDialog(0回傳的Dialog物件。

定義onCreateDialog(int)和onPrepareDialog(int , Dialog)回調方法的最好方式是用switch判斷式檢查傳入的id參數。每一個case對應一個對話框ID並且創造和定義各自的對話框。例如,想像一個遊戲使用兩個不同的對話框,一個顯示遊戲已經暫停,另一個顯示遊戲已經結束。首先,為每個對話框定義整數ID。


static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1;

然後,用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;
}

 當顯示其中對話框的時候,呼叫showDialog(int)傳入對話框ID。


showDialog(DIALOG_PAUSED_ID);


Dismissing a Dialog

當你想關閉一個對話框時,你可以在對話框物件上呼叫dismiss()方法,如果有必要,你也可以從activity呼叫dismissDialog(int),它可以為你有效的在對話框物件呼叫dismiss()方法。

如果你使用onCreateDialog(int)來管理你的對話框的狀態,然而你每次關閉對話框時,對話框物件的狀態會被Activity保留,如果你決定你不再需要此對話框或很重要的狀態被清除,你應該呼叫removeDialog(int)方法,移除任何物件內部引用和如果對話框正顯示,它將被關閉。

Using dismiss listener

如果你想要應用程式在對話框關閉時執行一些程序,你應該附加一個on-dismiss監聽器到對話框。

首先,定義DialogInterface.onDismissDialog接口,此接口只有一個方法onDismiss(DialogInterface),當對話框關閉時呼叫該方法。然後,傳送一個onDismissListener實作到setOnDismissListenr()。

然而,注意對話框也可以被"取消",這是一個特殊的情況,表示對話框被用戶明確的取消。這樣的情況發生在如果用戶按壓back鍵關閉對話框,或如果對話框明確呼叫cancel()方法(也許是來自對話框的取消按鈕)。當對話框被取消,OnDismissListener仍會被通知,但是如果你想要被告知對話框已經明確的被取消了,那你應該用setCancelListener()來註冊一個DialogInterface.onCancelListener。



沒有留言:

張貼留言