Android教程:- 对话框的小框架 Managed-Dialog
Android教程:- 对话框的小框架 Managed-Dialog
书里的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);
- }
- }
这个类作为你一系列需要用到对话框的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)
- {
- //不需要做任何事
- //由派生来来重写它
- }
- }
|
评论暂时关闭