很简单直接上代码
/**
* Created by Cwm on 2018/1/25.
* AlertDialog
*/
public class AlertDialog extends Dialog {
private AlertController mAlert;
protected static AlertController.AlertParams P;
public AlertDialog(@NonNull Context context, @StyleRes int themeResId) {
super(context, themeResId);
mAlert = new AlertController(this, getWindow());
}
public <T extends View> T getView(int viewId) {
if (P != null) {
return P.getView(viewId);
}
return null;
}
public static class Builder {
public Builder(@NonNull Context context) {
this(context, R.style.dialog);
}
public Builder(@NonNull Context context, @StyleRes int themeResId) {
P = new AlertController.AlertParams(context, themeResId);
}
/**
* 设置布局
*
* @param view
* @return
*/
public Builder setContentView(View view) {
P.mView = view;
P.mViewLayoutResId = 0;
return this;
}
public Builder setContentView(int viewId) {
P.mView = null;
P.mViewLayoutResId = viewId;
return this;
}
/**
* 设置文本
*
* @param viewId
* @param text
* @return
*/
public Builder setText(int viewId, String text) {
P.mTextArray.put(viewId, text);
return this;
}
/**
* 设置监听(单个点击)
*
* @param viewId
* @param listener
* @return
*/
public Builder setOnClickLinter(int viewId, View.OnClickListener listener) {
P.mListenerArray.put(viewId, listener);
return this;
}
/**
* 设置监听(多个点击)
*
* @param viewIds
* @param listener
* @return
*/
public Builder setOnClickLinter(int[] viewIds, View.OnClickListener listener) {
if (viewIds.length > 0) {
for (int i = 0; i < viewIds.length; i++) {
P.mListenerArray.put(viewIds[i], listener);
}
}
return this;
}
public Builder setCancelable(boolean cancelable) {
P.mCancelable = cancelable;
return this;
}
//配置一些通用参数
//宽度充满屏幕
public Builder setFullWidth() {
P.mWidth = ViewGroup.LayoutParams.MATCH_PARENT;
return this;
}
//从底部弹出是否有动画
public Builder setFormBottom(boolean isAnimation) {
if (isAnimation) {
P.mAnimations = R.style.mystyle;
}
P.mGravity = Gravity.BOTTOM;
return this;
}
//设置宽高
public Builder setWidthAndHeight(int width, int height) {
P.mWidth = width;
P.mHeight = height;
return this;
}
//设置默认动画(这个自己可以改)
public Builder setDefaultAnimation() {
P.mAnimations = R.style.mystyle;
return this;
}
//添加自定义动画
public Builder setAnimation(int styleAnimation) {
P.mAnimations = styleAnimation;
return this;
}
/**
* 创建AlertDialog
*
* @return
*/
public AlertDialog create() {
final AlertDialog dialog = new AlertDialog(P.mContext, P.mThemeResId);
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;
}
public AlertDialog show() {
final AlertDialog dialog = create();
dialog.show();
return dialog;
}
public Builder setOnCancelListener(OnCancelListener onCancelListener) {
P.mOnCancelListener = onCancelListener;
return this;
}
public Builder setOnDismissListener(OnDismissListener onDismissListener) {
P.mOnDismissListener = onDismissListener;
return this;
}
public Builder setOnKeyListener(OnKeyListener onKeyListener) {
P.mOnKeyListener = onKeyListener;
return this;
}
}
/**
* Created by Cwm on 2018/1/25.
*/
class AlertController {
private AlertDialog mDialog;
private Window mWindow;
public AlertController(AlertDialog alertDialog, Window window) {
this.mDialog = alertDialog;
this.mWindow = window;
}
/**
* 获取AlertDialog
*
* @return
*/
public AlertDialog getDialog() {
return mDialog;
}
/**
* 获取Window
*
* @return
*/
public Window getWindow() {
return mWindow;
}
public static class AlertParams {
private String TAG = "AlertDialog.Builder";
public Context mContext;
public int mThemeResId = 0;
public boolean mCancelable = true;//是否阴影取消弹框
//dialog消失监听
public DialogInterface.OnCancelListener mOnCancelListener;
//dialog销毁监听
public DialogInterface.OnDismissListener mOnDismissListener;
//dialog Key监听
public DialogInterface.OnKeyListener mOnKeyListener;
public View mView;//布局
public int mViewLayoutResId = 0;//布局ID
//存放text文本
public SparseArray<String> mTextArray = new SparseArray<>();
//存放点击事件
public SparseArray<View.OnClickListener> mListenerArray = new SparseArray<>();
public int mWidth = ViewGroup.LayoutParams.WRAP_CONTENT;//宽度
public int mAnimations = 0;//动画
public int mGravity = Gravity.CENTER;//弹出位置
public int mHeight = ViewGroup.LayoutParams.WRAP_CONTENT;//高度
private DialogViewHelper viewHelper = null;
public AlertParams(Context context, int themeResId) {
mContext = context;
mThemeResId = themeResId;
}
//获取View数据
public <T extends View> T getView(int viewId) {
if (viewHelper != null) {
return viewHelper.getView(viewId);
}
return null;
}
/**
* 绑定设置参数
*
* @param alert
*/
public void apply(AlertController alert) {
//设置布局 DialogViewHelper
if (mViewLayoutResId != 0) {
viewHelper = new DialogViewHelper(mContext, mViewLayoutResId);
}
if (mView != null) {
viewHelper = new DialogViewHelper();
viewHelper.setContentView(mView);
}
if (viewHelper == null) {
throw new IllegalArgumentException(TAG + " 请设置setContentView()布局");
}
//给Dialog设置布局
alert.getDialog().setContentView(viewHelper.getContentView());
//设置文本
int textSize = mTextArray.size();
for (int i = 0; i < textSize; i++) {
viewHelper.setText(mTextArray.keyAt(i), mTextArray.valueAt(i));
}
//设置点击事件
int ListenerSize = mListenerArray.size();
for (int i = 0; i < ListenerSize; i++) {
viewHelper.setListener(mListenerArray.keyAt(i), mListenerArray.valueAt(i));
}
//设置自定义效果、动画、弹出位置
Window window = alert.getWindow();
window.setGravity(mGravity);//设置位置
if (mAnimations != 0) {//设置动画
window.setWindowAnimations(mAnimations);
}
//设置宽高
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.width = mWidth;
attributes.height = mHeight;
window.setAttributes(attributes);
}
}
}
/**
* Created by Cwm on 2018/1/25.
* Dialog辅助类 处理View页面
*/
class DialogViewHelper {
private Context mContext;
private View mContentView;
private SparseArray<WeakReference<View>> mView;
public DialogViewHelper(Context context, int viewLayoutResId) {
this();
this.mContext = context;
mContentView = LayoutInflater.from(context).inflate(viewLayoutResId, null);
}
public DialogViewHelper() {
mView = new SparseArray<>();
}
/**
* 设置View布局
*
* @param contentView
*/
public void setContentView(View contentView) {
mContentView = contentView;
}
//设置文本
public void setText(int i, String s) {
//适用于Button extends TextView
//每次设置就比较麻烦
TextView view = getView(i);
if (view != null) {
view.setText(s);
}
}
//设置点击事件
public void setListener(int i, View.OnClickListener listener) {
View view = getView(i);
if (view != null) {
view.setOnClickListener(listener);
}
}
//从缓存中获取View
public <T extends View> T getView(int viewId) {
WeakReference<View> viewWeakReference = mView.get(viewId);
View view = null;
if (viewWeakReference != null) {
view = viewWeakReference.get();
}
if (view == null) {
view = mContentView.findViewById(viewId);
mView.put(viewId, new WeakReference<>(view));
}
return (T) view;
}
public View getContentView() {
return mContentView;
}
}
@Override
public void onClick(View v) {
AlertDialog dialog = new AlertDialog .Builder(this).setContentView(R.layout.detail_comment_dialog).fullWith() .fromBottom(false).show();
}