首页 > 其他分享 >打造BaseDialog

打造BaseDialog

时间:2023-07-20 14:22:45浏览次数:44  
标签:return int viewId dialog BaseDialog 打造 public view

看这文章之前请移步红橙Darren大佬的Builder设计模式 - 构建整个应用的万能Dialog 。本篇文章参考红橙Darren,如有侵权,联系即删。

最近空闲的时候在学习红橙Darren大佬的自定义View。奈何工作中Dialog 的需求很多、刚好又看到参考这篇文章,于是跟着大佬敲了一遍。直接看代码吧。

  1. BaseDialog
public class BaseDialog extends Dialog {  
  
    public AlertController mAlert;  
  
    public BaseDialog(Context context, int themeResId) {  
        super(context, themeResId);  
        mAlert = new AlertController(this, getWindow());  
    }  
  
    public <T extends View> T getView(int viewId) {  
        return mAlert.getView(viewId);  
    }  
  
    public void setOnClickListener(int viewId, View.OnClickListener listener) {  
        mAlert.setOnClickListener(viewId, listener);  
    }  
  
    public static class Builder {  
  
        private AlertController.AlertParams P;  
  
        public Builder(Context context) {  
            this(context, R.style.CusDialog);  
        }  
  
        public Builder(Context context, int themeResId) {  
            P = new AlertController.AlertParams(themeResId, context);  
            P.themeResId = themeResId;  
            P.context = context;  
        }  
  
        public Builder setText(int viewId, CharSequence text) {  
            P.textArray.put(viewId, text);  
            return this;        }  
  
        public Builder setWidthAndHeight(int width, int height) {  
            P.width = width;  
            P.height = height;  
            return this;        }  
  
        public Builder setOnClickListener(int viewId, View.OnClickListener listener) {  
            P.clickArray.put(viewId, listener);  
            return this;        }  
  
  
        /**  
         * Sets the dialog Absolute position base on the layoutParams.gravity         
         *@return This Builder object to allow for chaining of calls to set methods  
         */        
         public Builder setXAndY(int x, int y) {  
            P.x = x;  
            P.y = y;  
            return this;        
        }  
  
  
        public Builder setContentView(int layoutId) {  
            P.view = null;  
            P.layoutId = layoutId;  
            return this;        }  
  
        public Builder setContentView(View view) {  
            P.layoutId = 0;  
            P.view = view;  
            return this;        
        }  
  
        /**  
         * Sets whether the dialog is cancelable or not.  Default is true.                
         * @return This Builder object to allow for chaining of calls to set methods  
         */        
         public Builder setCancelable(boolean cancelable) {  
            P.cancelable = cancelable;  
            return this;       
        }  
  
  
        /**  
         * Sets the callback that will be called if the dialog is canceled.
         * @return This Builder object to allow for chaining of calls to set methods  
         * @see #setCancelable(boolean)  
         * setOnDismissListener(OnDismissListener)         
         * */        
          public Builder setOnCancelListener(DialogInterface.OnCancelListener                           onCancelListener) {  
            P.onCancelListener = onCancelListener;  
            return this;        
            }  
  
        /**  
         * Sets the callback that will be called when the dialog is dismissed       
         * @return This Builder object to allow for chaining of calls to set methods  
         */        
         public Builder setOnDismissListener(DialogInterface.OnDismissListener                                       onDismissListener) {  
            P.onDismissListener = onDismissListener;  
            return this;        
        }  
  
        /**  
         * Sets the callback that will be called if a key is dispatched to the dialog.         *         * @return This Builder object to allow for chaining of calls to set methods  
         */        
         public Builder setOnKeyListener(DialogInterface.OnKeyListener onKeyListener) {  
            P.onKeyListener = onKeyListener;  
            return this;        
        }  
  
  
        public BaseDialog create() {  
            // Context has already been wrapped with the appropriate theme.  
            final BaseDialog dialog = new BaseDialog(P.context, P.themeResId);  
            P.apply(dialog.mAlert);  
            dialog.setCancelable(P.cancelable);  
            if (P.cancelable) {  
                dialog.setCanceledOnTouchOutside(true);  
            }  
            dialog.setOnCancelListener(P.onCancelListener);  
            dialog.setOnDismissListener(P.onDismissListener);  
            if (P.onKeyListener != null) {  
                dialog.setOnKeyListener(P.onKeyListener);  
            }  
            return dialog;  
        }  
  
        public BaseDialog show() {  
            final BaseDialog dialog = create();  
            dialog.show();  
            return dialog;  
        }  
    }  
}
  1. DialogController
public class DialogController {  
  
    private DialogViewHelper mViewHelper;  
    private BaseDialog mDialog;  
    private Window mWindow;  
  
    public DialogController(BaseDialog dialog, Window window) {  
        mDialog = dialog;  
        mWindow = window;  
    }  
  
    /**  
     * 获取Dialog  
     *     * @return  
     */  
    public BaseDialog getDialog() {  
        return mDialog;  
    }  
  
    /**  
     * 获取window  
     *     * @return  
     */  
    public Window getWindow() {  
        return mWindow;  
    }  
  
    public DialogViewHelper getViewHelper() {  
        return mViewHelper;  
    }  
  
    /**  
     * 设置View的辅助  
     *  
     * @param viewHelper  
     */  
    public void setDialogViewHelper(DialogViewHelper viewHelper) {  
        this.mViewHelper = viewHelper;  
    }  
  
    /**  
     * 设置文本  
     *  
     * @param viewId  
     * @param text  
     */  
    public void setText(int viewId, CharSequence text) {  
        mViewHelper.setText(viewId, text);  
    }  
  
    /**  
     * 设置点击事件  
     *  
     * @param viewId  
     * @param listener  
     */  
    public void setOnClickListener(int viewId, View.OnClickListener listener) {  
        mViewHelper.setOnClickListener(viewId, listener);  
    }  
  
    /**  
     * 通过id获取View  
     *     * @param viewId  
     * @param <T>  
     * @return  
     */  
    public <T extends View> T getView(int viewId) {  
        return mViewHelper.getView(viewId);  
    }  
  
    public static class AlertParams {  
        public int themeResId;  
        public Context context;  
        public boolean cancelable = false;  
        public DialogInterface.OnCancelListener onCancelListener;  
        public DialogInterface.OnDismissListener onDismissListener;  
        public DialogInterface.OnKeyListener onKeyListener;  
        public View view;  
        public int layoutId;  
        public SparseArray<CharSequence> textArray = new SparseArray<>();  
        public SparseArray<View.OnClickListener> clickArray = new SparseArray<>();  
        public int width = ViewGroup.LayoutParams.WRAP_CONTENT;  
        public int height = ViewGroup.LayoutParams.WRAP_CONTENT;  
        public int x = 0;  
        public int y = 0;  
        public int gravity = Gravity.CENTER;  
  
        public AlertParams(int themeResId, Context context) {  
            this.themeResId = themeResId;  
            this.context = context;  
        }  
  
        public void apply(DialogController mAlert) {  
  
            DialogViewHelper viewHelper = null;  
  
            if (layoutId != 0) {  
                viewHelper = new DialogViewHelper(context, layoutId);  
            }  
  
            if (view != null) {  
                viewHelper = new DialogViewHelper();  
                viewHelper.setContentView(view);  
            }  
            mAlert.setDialogViewHelper(viewHelper);  
  
            if (viewHelper != null)  
                mAlert.getDialog().setContentView(viewHelper.getContentView());  
  
            //设置文本  
            int textArraySize = textArray.size();  
            for (int i = 0; i < textArraySize; i++) {  
                mAlert.setText(textArray.keyAt(i), textArray.valueAt(i));  
            }  
  
            //设置点击事件  
            int clickArraySize = textArray.size();  
            for (int i = 0; i < clickArraySize; i++) {  
                mAlert.setOnClickListener(clickArray.keyAt(i), clickArray.valueAt(i));  
            }  
  
            //设置Dialog宽高、绝对位置、gravity  
            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();  
            layoutParams.width = width;  
            layoutParams.height = height;  
            layoutParams.gravity = gravity;  
            layoutParams.y = y;  
            layoutParams.x = x;  
  
            mAlert.getDialog().getWindow().setAttributes(layoutParams);  
        }  
    }  
}
  1. DialogViewHelper
public class DialogViewHelper {  
  
    private View mContentView = null;  
  
    //缓存View 减少View findViewById  
    private SparseArray<WeakReference<View>> mViews;  //WeakReference防止霸气侧漏、内存泄漏.  
  
    public DialogViewHelper(Context context, int layoutId) {  
        this();  
        mContentView = LayoutInflater.from(context).inflate(layoutId, null);  
    }  
  
    public DialogViewHelper() {  
        if (mViews == null) {  
            mViews = new SparseArray<>();  
        }  
    }  
  
    public void setContentView(View view) {  
        mContentView = view;  
    }  
  
  
  
    public void setText(int viewId, CharSequence charSequence) {  
        TextView view = getView(viewId);  
        if (view != null) {  
            view.setText(charSequence);  
        }  
    }  
  
    public void setOnClickListener(int viewId, View.OnClickListener listener) {  
        View view = getView(viewId);  
        if (view != null) {  
            view.setOnClickListener(listener);  
        }  
    }  
  
    public <T extends View> T getView(int viewId) {  
        View view;  
        WeakReference<View> viewWeakReference = mViews.get(viewId);  
        if (viewWeakReference == null) {  
            view = mContentView.findViewById(viewId);  
            if (view != null) {  
                mViews.put(viewId, new WeakReference<>(view));  
            }  
        } else {  
            view = viewWeakReference.get();  
        }  
        return (T) view;  
    }  
  
    public View getContentView() {  
        return mContentView;  
    }  
}
  1. 使用教程
BaseDialog dialog= new BaseDialog.Builder(this).  
        setContentView(R.layout.layout_net_out_create).  
        setWidthAndHeight(896, 150).  //设置宽高、默认都是 WRAP_CONTENT
        setCancelable(true).         //是否点击外部可以取消                                              
        setXAndY(400, 500).    //相对位置 默认是0,0  
        setGravity(Gravity.TOP).   //默认是Gravity.CENTER  
        create();  
  
dialog.show();  
  
//设置点击事件  
dialog.setOnClickListener(R.id.dialog_finish_vote_cancel, new View.OnClickListener() {  
    @Override  
    public void onClick(View view) {  
        dialog.dismiss();  
    }  
});  
  
//可以拿到View 的实例  
final TextView textView=dialog.getView(R.id.dialog_finish_vote_cancel);

标签:return,int,viewId,dialog,BaseDialog,打造,public,view
From: https://www.cnblogs.com/mhzf/p/17568307.html

相关文章

  • 智能制造之路—从0开始打造一套轻量级MOM平台
    一、概述面对数字化浪潮,MOM需求迈入上升期,数字化从“可选项”变成了企业竞争“必选项”。制造行业每个工厂的生产逻辑都不尽相同,流程的梳理、数据统一化都需要调配很长时间。对于制造企业来说一套快速构建业务的平台,看起来是解决制造行业“每个工厂生产逻辑不同”问题的良方。......
  • 掌数科技携手华为云GaussDB,助力金融科技创新,联合打造行业标杆
    本文分享自华为云社区《掌数科技携手华为云GaussDB,助力金融科技创新,联合打造行业标杆》,作者:GaussDB数据库。近日,在华为开发者大会2023(Cloud)的“GaussDB数据库,打造轻量化迁移部署方案”专题论坛上,掌数科技解决方案总经理高星作为华为云GaussDB的优秀合作伙伴,分享了掌数科技和华......
  • 打造我的酷炫终端
    之前的这篇文章「从0开始学习GitHub系列之「Git速成」」就有人给我留言说,张哥你的终端怎么这么酷炫,碉堡了,简直跟你本人一样帅,能告诉我是用了什么牛逼的工具么?你以为说我帅我就会告诉你了么?真是太天真了,我准备单独写篇文章告诉你!1.iTerm2我用的电脑是Mac,大家都知道Mac上自带......
  • 用ChatGPT打造全AI员工的游戏公司
    清华用ChatGPT打造了个「零人工含量」的「游戏公司」,从老板到员工都是AI的那种!只要你提出想法,从设计到测试的完整流程,都由AI帮忙搞定。整个过程走下来,只要七分钟就能完成,成本不到0.3美元(人民币两块多一点)!这个「公司」被命名为「ChatDev」,顾名思义,就......
  • 塔思派汉堡:打造适合中国人口味的本土汉堡品牌
    塔思派汉堡是一家在中国市场上异军突起的本土汉堡品牌。该品牌致力于打造适合中国人口味的汉堡产品,并在市场上获得了广泛的认可和好评。塔思派汉堡的起源可以追溯到中国经济的快速发展和人们对快餐需求的日益增长。在借鉴西方汉堡文化的基础上,塔思派汉堡结合中国传统的饮食文化和消......
  • 建站新手福利:免费网页模板大合集,快速打造专业网站!
    今天给大家带来的网站模板素材,网站类型丰富,包含户外旅行、餐饮、个人网站等等,可以学习和参考其中的布局排版和配色。 ⬇⬇⬇点击获取更多设计资源https://js.design/community?category=design&source=bky&plan=bbqbky772   1、设计公司&工作室相信大家都希望拥有属......
  • 打造独具匠心的UI设计组件库:设计师入门必读!
    今天给大家分享一篇关于组件化设计的总结,希望可以带给大家更多设计思考。 什么是组件化⬇⬇⬇点击获取更多设计资源https://js.design/community?category=design&source=bky&plan=bbqbky772   组建化是构成界面的最基础元素和重复出现控件的集合体,也就是常说的组件......
  • 免费下载1000+工程建筑、设计领域资料,助力打造出高质量设计方案和汇报场景!
    作为一名工程设计、施工人员,设计方案制作、工程汇报场景搭建的情景再常见不过。日常需要的模型是必不可少的,但最令人头大的问题是如何寻找方案素材。想要表达的信息越多,素材获取就越是苦恼!有没有一款软件能够集方案三维汇报展示与模型数据下载为一体呢?当然有。图新说,作为国产三......
  • 智能制造之路—从0开始打造一套轻量级MOM平台
    一、概述面对数字化浪潮,MOM需求迈入上升期,数字化从“可选项”变成了企业竞争“必选项”。制造行业每个工厂的生产逻辑都不尽相同,流程的梳理、数据统一化都需要调配很长时间。对于制造企业来说一套快速构建业务的平台,看起来是解决制造行业“每个工厂生产逻辑不同”问题的良方。企......
  • 打造有效的产品帮助中心的关键步骤
    在当今竞争激烈的市场中,为产品提供优质的客户支持是至关重要的。而一个有效的产品帮助中心可以成为解决客户问题和提供相关信息的中心。本文将介绍打造一个有效的产品帮助中心的关键步骤,帮助你提升客户体验并增强产品的用户满意度。1.选择合适的管理工具首先,选择适合你的业务需求......