AlertDialog的Builder模式

263 阅读1分钟

AlertDialog的Builder模式: 查看其构造函数:

protected AlertDialog(Context context) {
this(context, resolveDialogTheme(context, 0), true);
    }

protected AlertDialog(Context context, int theme) {
    this(context, theme, true);
    }

AlertDialog(Context context, int theme, boolean createThemeContextWrapper) {
    super(context, resolveDialogTheme(context, theme), createThemeContextWrapper);

mWindow.alwaysReadCloseOnTouchAttr();
mAlert = new AlertController(getContext(), this, getWindow());
}

protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
    super(context, resolveDialogTheme(context, 0));
    mWindow.alwaysReadCloseOnTouchAttr();
    setCancelable(cancelable);
    setOnCancelListener(cancelListener);
    mAlert = new AlertController(context, this, getWindow());
}

可以看出其构造函数均属于包所有,包外无法对其进行调用,个人认为应该时为了让android内部开发人员可以调用 那么,对于普通Android开发人员,要进行其创建,必须调用其提供的静态内部类Builder类进行构造。 可

以看到Builder中包含大量setXXXX方法

进入任意一个方法可以得知,其将值保存如AlertController.Params中

 private final AlertController.AlertParams P;

最后,调用Builder的create方法:

public AlertDialog create() {
    final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
     P.apply(dialog.mAlert);
     dialog.setCancelable(P.mCancelable);
    if (P.mCancelable) {
        dialog.setCanceledOnTouchOutside(true);
    }
    dialog.setOnCancelListener(P.mOnCancelListener);
    dialog.setOnDismissListener(P.mOnDismissListener);
    if (P.mOnKeyListener != null) {
        dialog.setOnKeyListener(P.mOnKeyListener);
     }
    return dialog;
}

可以看到,在create( )方法中,调用了AlertDialog中定的方法将值设置进去,此时,开发者就可以合法持有AlertDialog的对象了 但是注意,此时,AlertDialog仍然未正式展示,仍有最后步骤需要进行:

 public AlertDialog show() {
     AlertDialog dialog = create();
    dialog.show();
    return dialog;
}

总结一下:源码中对于AlertDialog进行这样的设计,个人认为可能的原因有两个: * 保证了代码的安全性,隐藏了实现细节 * 在Builder中大量的setXXX方法,返回了Builder自身,可以行程链式调用,使得代码更加整洁

所以,正确的AlertDialog创建流程:

AlertDialog.Builder builder=new AlertDialog.Builder(Context);
builder.setXXX()
    .setXXXX()
    .......;
AlertDialog dialog=builder.create();
dialog.show();