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. }  
  • 1
  • 2
  • 下一页

相关内容