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类进行构造。 可

进入任意一个方法可以得知,其将值保存如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();