[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將負責顯示並保存物件
留言
張貼留言