歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android教程:- 對話框的小框架 Managed-Dialog

Android教程:- 對話框的小框架 Managed-Dialog

日期:2017/3/1 10:45:34   编辑:Linux編程

書裡的dialog的那一章 書名 Pro Android 3

在本章,你看到的對話框在Android裡是一種特殊的挑戰;

我們向您展示了異步對話框的影響

提出了一個抽象的概念,簡化管理對話框


開始分析每一個類

IDialogProtocol

這個接口用來管理對話框 它的職責包括:

0.1創建對話框 以及任何時候都可以復用它

0.2顯示對話框

0.3識別按鈕點擊

0.4關閉對話框

  1. public interface IDialogProtocol
  2. {
  3. public int getDialogId();
  4. public Dialog create();
  5. public void prepare(Dialog dialog);
  6. public void show();
  7. public void onClickHook(int buttonId);
  8. }

ManagedActivityDialog

實現了IDialogProtocol這接口,

template-hook pattern這應該是某種模式,翻譯過來叫做 模版掛機模式,我懂的甚少,忘多多指教

它允許派生類有專門的onClickHook方法,負責將show()方法重定向到parent activity

也為show()方法提供了更自然的實現

當對話框完成了點擊事件的時候會通知dialogs的parent activity

你可以為你所有新的dialog使用ManagedActivityDialog這個類作為基類

  1. public abstract class ManagedActivityDialog implements IDialogProtocol
  2. ,android.content.DialogInterface.OnClickListener
  3. {
  4. private ManagedDialogsActivity mActivity;
  5. private int mDialogId;
  6. public ManagedActivityDialog(ManagedDialogsActivity a, int dialogId)
  7. {
  8. mActivity = a;
  9. mDialogId = dialogId;
  10. }
  11. public int getDialogId()
  12. {
  13. return mDialogId;
  14. }
  15. public void show()
  16. {
  17. mActivity.showDialog(mDialogId);
  18. }
  19. public void onClick(DialogInterface v, int buttonId)
  20. {
  21. //點擊事件
  22. onClickHook(buttonId);
  23. //按鈕的點擊事件完畢後通知dialogs的當前activity
  24. this.mActivity.dialogFinished(this, buttonId);
  25. }
  26. }

DialogRegistry

這個類負責兩件事

一.保持dialog的ID跟實際的dialog的實例之間的映射,這也就意味著所有調用OnCreate和OnPrepare中特定的dialog 都使用ID-到-對象這樣的的映射

二,ManagedDialogsActivity這個Activity使用DialogResistry作為一個倉庫來創建注冊新的對話框

  1. public class DialogRegistry
  2. {
  3. SparseArray<IDialogProtocol> idsToDialogs = new SparseArray();
  4. public void registerDialog(IDialogProtocol dialog)
  5. {
  6. idsToDialogs.put(dialog.getDialogId(),dialog);
  7. }
  8. public Dialog create(int id)
  9. {
  10. IDialogProtocol dp = idsToDialogs.get(id);
  11. if (dp == null) return null;
  12. return dp.create();
  13. }
  14. public void prepare(Dialog dialog, int id)
  15. {
  16. IDialogProtocol dp = idsToDialogs.get(id);
  17. if (dp == null)
  18. {
  19. throw new RuntimeException("Dialog id is not registered:" + id);
  20. }
  21. dp.prepare(dialog);
  22. }
  23. }
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()

  1. public class ManagedDialogsActivity extends Activity
  2. implements IDialogFinishedCallBack
  3. {
  4. //A registry for managed dialogs
  5. private DialogRegistry dr = new DialogRegistry();
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. this.registerDialogs();
  9. }
  10. protected void registerDialogs()
  11. {
  12. //不做任何事
  13. //派生類重寫此方法
  14. //注冊所有的dialog
  15. //例
  16. //registerDialog(this.DIALOG_ALERT_ID_D,gmad);
  17. }
  18. public void registerDialog(IDialogProtocol dialog)
  19. {
  20. this.dr.registerDialog(dialog);
  21. }
  22. @Override
  23. protected Dialog onCreateDialog(int id) {
  24. return this.dr.create(id);
  25. }
  26. @Override
  27. protected void onPrepareDialog(int id, Dialog dialog) {
  28. this.dr.prepare(dialog, id);
  29. }
  30. public void dialogFinished(ManagedActivityDialog dialog, int buttonId)
  31. {
  32. //不需要做任何事
  33. //由派生來來重寫它
  34. }
  35. }
Copyright © Linux教程網 All Rights Reserved