書裡的dialog的那一章 書名 Pro Android 3
在本章,你看到的對話框在Android裡是一種特殊的挑戰;
我們向您展示了異步對話框的影響
提出了一個抽象的概念,簡化管理對話框
開始分析每一個類
IDialogProtocol
這個接口用來管理對話框 它的職責包括:
0.1創建對話框 以及任何時候都可以復用它
0.2顯示對話框
0.3識別按鈕點擊
0.4關閉對話框
- public interface IDialogProtocol
- {
- public int getDialogId();
- public Dialog create();
- public void prepare(Dialog dialog);
- public void show();
- public void onClickHook(int buttonId);
- }
ManagedActivityDialog
實現了IDialogProtocol這接口,
template-hook pattern這應該是某種模式,翻譯過來叫做 模版掛機模式,我懂的甚少,忘多多指教
它允許派生類有專門的onClickHook方法,負責將show()方法重定向到parent activity
也為show()方法提供了更自然的實現
當對話框完成了點擊事件的時候會通知dialogs的parent activity
你可以為你所有新的dialog使用ManagedActivityDialog這個類作為基類
- public abstract class ManagedActivityDialog implements IDialogProtocol
- ,android.content.DialogInterface.OnClickListener
-
- {
- private ManagedDialogsActivity mActivity;
- private int mDialogId;
- public ManagedActivityDialog(ManagedDialogsActivity a, int dialogId)
- {
- mActivity = a;
- mDialogId = dialogId;
- }
- public int getDialogId()
- {
- return mDialogId;
- }
- public void show()
- {
- mActivity.showDialog(mDialogId);
- }
- public void onClick(DialogInterface v, int buttonId)
- {
- //點擊事件
- onClickHook(buttonId);
- //按鈕的點擊事件完畢後通知dialogs的當前activity
- this.mActivity.dialogFinished(this, buttonId);
- }
- }
DialogRegistry
這個類負責兩件事
一.保持dialog的ID跟實際的dialog的實例之間的映射,這也就意味著所有調用OnCreate和OnPrepare中特定的dialog 都使用ID-到-對象這樣的的映射
二,ManagedDialogsActivity這個Activity使用DialogResistry作為一個倉庫來創建注冊新的對話框
- public class DialogRegistry
- {
- SparseArray<IDialogProtocol> idsToDialogs = new SparseArray();
- public void registerDialog(IDialogProtocol dialog)
- {
- idsToDialogs.put(dialog.getDialogId(),dialog);
- }
-
- public Dialog create(int id)
- {
- IDialogProtocol dp = idsToDialogs.get(id);
- if (dp == null) return null;
-
- return dp.create();
- }
- public void prepare(Dialog dialog, int id)
- {
- IDialogProtocol dp = idsToDialogs.get(id);
- if (dp == null)
- {
- throw new RuntimeException("Dialog id is not registered:" + id);
- }
- dp.prepare(dialog);
- }
- }
ManagedDialogsActivity
這個類作為你一系列需要用到對話框的Activity的基類,支持管理對話框動作.
它使一個單實例的DialogRegistry 去跟蹤IDialogProtocol確定的所有的managed-dialog
它允許所有派生的Activity通過registerDialog()這個方法來注冊它們自己的對話框
transferring the create and prepare semantics to the respective dialog instance by locating that dialog instance in the dialog registry
上面這句話太長了我翻譯不過來,我的理解就是把craete 和prepare正確的轉向定位到DialogRegistry中的不同的對話框實例
它還為每一個在DialogRegistry中的dialog提供了回調方法dialogFinished()
- public class ManagedDialogsActivity extends Activity
- implements IDialogFinishedCallBack
- {
- //A registry for managed dialogs
- private DialogRegistry dr = new DialogRegistry();
-
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.registerDialogs();
- }
-
- protected void registerDialogs()
- {
- //不做任何事
- //派生類重寫此方法
- //注冊所有的dialog
-
- //例
- //registerDialog(this.DIALOG_ALERT_ID_D,gmad);
- }
- public void registerDialog(IDialogProtocol dialog)
- {
- this.dr.registerDialog(dialog);
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
- return this.dr.create(id);
- }
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- this.dr.prepare(dialog, id);
- }
-
- public void dialogFinished(ManagedActivityDialog dialog, int buttonId)
- {
- //不需要做任何事
- //由派生來來重寫它
- }
- }