[Android] Dialog-Activity如何有效管理Dialog(Dialog Management)
Dialog是Android App裡使用頻率蠻高的組件,通常它用來暫時中斷User目前的動作並完成小型的工作(顯示簡短訊息或是提供選項進行互動)。一般Dialog都是在需要顯示訊息時,程式動態建立並顯示它,這樣的方法,對於Dialog使用頻率不高的Application是十分便捷的。但是對於使用頻率高的Application而言,所有的Dialog建立程式碼分散在各個函數中,執行時的Dialog物件管理以及日後維護的困難度將會提高。
Activity如何集中管理Dialog Objects
當程式中可能含有數個Dialog事件時,那應該考慮使用Activity的Dialog管理機制,它將會幫你省去許多麻煩。Activity提供了統一控制Dialog物件的函式包含了showDialog(int id)、dismissDialog(int id)、removeDialog(int id),分別代表顯示、隱藏以及移除Dialog物件。
上述三個函式有個共通點-都代入了int型態的id變數,它代表了Dialog物件的unique id,Activity將使用這個id作為保存Dialog object的依據,當程式呼叫Activity的showDialog(i)函式時,系統會先到保存Dialog物件的SparseArray裡找尋id=i的Dialog,如果有找到目標,就呼叫其show()函式;如果沒有找到目標,將會呼叫Activity的onCreateDialog(int id, Bundle arg)函式建立Dialog並保存至SparseArray中(見下圖),往後要操作id為i的Dialog時,系統都會透過這個保存機制找尋到正確的Dialog,因此,onCreateDialog函數只有在Dialog第一次被建立時才呼叫。而這個保存管理機制要正常運作的關鍵點在於:必須實作Activity的onCreateDialog函式,如果你沒有正確實作這個函式,當系統呼叫showDialog時,將不會有任何的dialog被建立且保存。
實作onCreateDialog
通常onCreateDialog的實作方法都是採用switch條件式來針對不同的id進行相對應的Dialog物件建立,這些id可以以有意義的靜態變數方式命名,以方便實作onCreateActivity,本文將實作一個範例,它將以Activity的Dialog管理機制來建立三種不同用途的Dialog。
程式碼說明
一、定義dialog id,這裡以有意義的靜態int變數命名(例如:歡迎訊息Dialog,其id為"DIALOG_WELCOME)
Activity如何集中管理Dialog Objects
當程式中可能含有數個Dialog事件時,那應該考慮使用Activity的Dialog管理機制,它將會幫你省去許多麻煩。Activity提供了統一控制Dialog物件的函式包含了showDialog(int id)、dismissDialog(int id)、removeDialog(int id),分別代表顯示、隱藏以及移除Dialog物件。
上述三個函式有個共通點-都代入了int型態的id變數,它代表了Dialog物件的unique id,Activity將使用這個id作為保存Dialog object的依據,當程式呼叫Activity的showDialog(i)函式時,系統會先到保存Dialog物件的SparseArray裡找尋id=i的Dialog,如果有找到目標,就呼叫其show()函式;如果沒有找到目標,將會呼叫Activity的onCreateDialog(int id, Bundle arg)函式建立Dialog並保存至SparseArray中(見下圖),往後要操作id為i的Dialog時,系統都會透過這個保存機制找尋到正確的Dialog,因此,onCreateDialog函數只有在Dialog第一次被建立時才呼叫。而這個保存管理機制要正常運作的關鍵點在於:必須實作Activity的onCreateDialog函式,如果你沒有正確實作這個函式,當系統呼叫showDialog時,將不會有任何的dialog被建立且保存。
實作onCreateDialog
通常onCreateDialog的實作方法都是採用switch條件式來針對不同的id進行相對應的Dialog物件建立,這些id可以以有意義的靜態變數方式命名,以方便實作onCreateActivity,本文將實作一個範例,它將以Activity的Dialog管理機制來建立三種不同用途的Dialog。
程式碼說明
一、定義dialog id,這裡以有意義的靜態int變數命名(例如:歡迎訊息Dialog,其id為"DIALOG_WELCOME)
//定義dialog id private static final int DIALOG_WELCOME = 0; private static final int DIALOG_CHECK = 1; private static final int DIALOG_LEAVE = 2;二、實作onCreateDialog,這裡用switch判斷式,根據id來進行相對應的Dialog物件create
@Override
protected Dialog onCreateDialog(int id, Bundle args){
//Dialog object
Dialog dialog = null;
switch(id)
{
case DIALOG_WELCOME:
dialog = new AlertDialog.Builder(this)
.setTitle("系統訊息")
.setMessage("Welcome")
.setNeutralButton("關閉", null)
.create();
break;
case DIALOG_CHECK:
dialog = new AlertDialog.Builder(this)
.setTitle("系統訊息")
.setMessage("Are you sure?")
.setNegativeButton("確認", null)
.setPositiveButton("取消", null)
.create();
break;
case DIALOG_LEAVE:
dialog = new AlertDialog.Builder(this)
.setTitle("系統訊息")
.setMessage("Leave now?")
.setNegativeButton("確認", null)
.setPositiveButton("取消", null)
.create();
break;
default:
dialog = null;
}
return dialog;
}
三、建立按鈕click事件,呼叫Activity的showDialog函式,並代入相對應的Dialog id//取得按鈕參考
Button showWelcome = (Button)findViewById(R.id.showWelcome);
Button showCheck = (Button)findViewById(R.id.showCheck);
Button showLeave = (Button)findViewById(R.id.showLeave);
//註冊Click event listener
showWelcome.setOnClickListener(clickListener);
showCheck.setOnClickListener(clickListener);
showLeave.setOnClickListener(clickListener);
/**Show dialog button click event listener*/
OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View view) {
//判斷按下誰以show出對應的dialog
switch(view.getId())
{
case R.id.showWelcome:
AlertDialogManage.this.showDialog(DIALOG_WELCOME);
break;
case R.id.showCheck:
AlertDialogManage.this.showDialog(DIALOG_CHECK);
break;
case R.id.showLeave:
AlertDialogManage.this.showDialog(DIALOG_LEAVE);
break;
}
}
};
四、完成Dialog控管機制,當觸發Dialog顯示事件時(按下按鈕),Activity將負責顯示並保存物件

留言
張貼留言