[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)
//定義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將負責顯示並保存物件

留言

這個網誌中的熱門文章

【海外婚紗】道具行李篇

[Android] layout_weight的妙用-讓View的大小以百分比率顯示(proportionate size)