歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

書裡的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. {  
  5.     private ManagedDialogsActivity mActivity;  
  6.     private int mDialogId;  
  7.     public ManagedActivityDialog(ManagedDialogsActivity a, int dialogId)  
  8.     {  
  9.         mActivity = a;  
  10.         mDialogId = dialogId;  
  11.     }  
  12.     public int getDialogId()  
  13.     {  
  14.         return mDialogId;  
  15.     }  
  16.     public void show()  
  17.     {  
  18.         mActivity.showDialog(mDialogId);  
  19.     }  
  20.     public void onClick(DialogInterface v, int buttonId)  
  21.     {  
  22.           //點擊事件   
  23.         onClickHook(buttonId);  
  24.           //按鈕的點擊事件完畢後通知dialogs的當前activity   
  25.         this.mActivity.dialogFinished(this, buttonId);  
  26.     }  
  27. }  

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.       
  9.     public Dialog create(int id)  
  10.     {  
  11.         IDialogProtocol dp = idsToDialogs.get(id);  
  12.         if (dp == nullreturn null;  
  13.           
  14.         return dp.create();  
  15.     }  
  16.     public void prepare(Dialog dialog, int id)  
  17.     {  
  18.         IDialogProtocol dp = idsToDialogs.get(id);  
  19.         if (dp == null)  
  20.         {  
  21.             throw new RuntimeException("Dialog id is not registered:" + id);  
  22.         }  
  23.         dp.prepare(dialog);  
  24.     }  
  25. }  
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.       
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         this.registerDialogs();  
  10.     }  
  11.       
  12.     protected void registerDialogs()  
  13.     {  
  14.         //不做任何事   
  15.         //派生類重寫此方法   
  16.         //注冊所有的dialog   
  17.           
  18.         //例   
  19.         //registerDialog(this.DIALOG_ALERT_ID_D,gmad);   
  20.     }  
  21.     public void registerDialog(IDialogProtocol dialog)  
  22.     {  
  23.         this.dr.registerDialog(dialog);  
  24.     }  
  25.       
  26.     @Override  
  27.     protected Dialog onCreateDialog(int id) {  
  28.                 return this.dr.create(id);  
  29.     }  
  30.     @Override  
  31.     protected void onPrepareDialog(int id, Dialog dialog) {  
  32.                 this.dr.prepare(dialog, id);  
  33.     }  
  34.   
  35.     public void dialogFinished(ManagedActivityDialog dialog, int buttonId)  
  36.     {  
  37.         //不需要做任何事   
  38.         //由派生來來重寫它   
  39.     }  
  40. }  
Copyright © Linux教程網 All Rights Reserved