打造通用的AlertDialog

很简单直接上代码

/**
 * 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();
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值