美文网首页UI效果仿写自定义View
利用建造者模式封装一个简单好用的dialog

利用建造者模式封装一个简单好用的dialog

作者: 等风来_Android | 来源:发表于2018-06-14 11:52 被阅读785次

    本着不再重复造轮子的精神,封装一个简单实用的Dialog,
    1,支持自定义布局
    2,支持设置显示位置以及与屏幕边距
    3,随心所欲的添加动画效果
    4,添加子View接口回调,可以为所有子View添加点击事件
    5,链式调用,一行实现添加所有属性以及回调

    代码如下:

    public class DialogUtils {
    
        private Context mContext;
    
        private int layoutId;
    
        private int layoutPosition;
    
        private int padingTop;
        private int padingBottom;
        private int padingRight;
        private int padingLeft;
    
    
        /**
         * 静态内部类的方式构建单例模式
         */
    
        private DialogUtils(){}
    
        private static class DialogHolder{
    
            private static DialogUtils instance= new DialogUtils();
    
        }
    
        public static DialogUtils getInstance(){
    
            return DialogHolder.instance;
        }
    
        /**
         * 传入上下文
         * @param context
         * @return
         */
    
        public final DialogUtils with(Context context){
            this.mContext= context;
            return this;
    
        }
    
        /**
         * 传入弹窗需要的布局
         * @param layoutId
         * @return
         */
    
        public final DialogUtils setlayoutId(int layoutId){
            this.layoutId= layoutId;
            return this;
    
        }
    
        /**
         * 设置弹窗的位置
         * @param layoutPosition
         * @return
         */
    
        public final DialogUtils setlayoutPosition(int layoutPosition){
            this.layoutPosition= layoutPosition;
            return this;
    
        }
    
    
        /**
         * 设置弹窗距离屏幕的距离
         * @param padingLeft
         * @param padingTop
         * @param padingRight
         * @param padingBottom
         * @return
         */
        public final DialogUtils setlayoutPading(int padingLeft,int padingTop,int padingRight,int padingBottom){
            this.padingLeft= padingLeft;
            this.padingTop= padingTop;
            this.padingRight= padingRight;
            this.padingBottom= padingBottom;
            return this;
    
        }
    
        public void show(){
    
            Dialog dialog = new Dialog(mContext, R.style.ActionSheetDialogStyle);
            View view = LayoutInflater.from(mContext).inflate(layoutId, null);
            dialog.setContentView(view);
    
            //获得dialog的window窗口
            Window window = dialog.getWindow();
            //设置dialog在屏幕位置
            window.setGravity(layoutPosition);
    
    
            window.getDecorView().setPadding(padingLeft, padingTop, padingRight, padingBottom);
            //获得window窗口的属性
            android.view.WindowManager.LayoutParams lp = window.getAttributes();
            //设置窗口宽度为充满全屏
            lp.width = WindowManager.LayoutParams.MATCH_PARENT;
            //设置窗口高度为包裹内容
            lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
            //将设置好的属性set回去
            window.setAttributes(lp);
            dialog.show();
    
        }
    

    添加回调接口:

    public interface ViewInterface {
            void getChildView(View view, int layoutResId);
        }
    
        /**
         * 设置子View
         *
         * @param listener ViewInterface
         * @return Builder
         */
        public DialogUtils setOnChildViewclickListener(DialogUtils.ViewInterface listener) {
            this.listener = listener;
            return this;
        }
    

    设置弹窗消失:

    public static void dismiss(){
    
            if (dialog!=null && dialog.isShowing()){
                dialog.dismiss();
            }
        }
    

    加入自定义动画:

     switch (dialogAnimaType){
                case 0:
                    //自下而上动画
                    dialog = new Dialog(mContext, R.style.ActionSheetDialogStyle);
                    break;
                case 1:
                    //淡入淡出缩放动画
                    dialog = new Dialog(mContext, R.style.ActionSheetDialogStyle1);
                    break;
            }
    

    然后调用:

    DialogUtils.getInstance()
                            .with(getApplicationContext())//上下文
                            .setlayoutId(R.layout.make_money_pop_window_layout)//布局文件
                            .setlayoutPosition(Gravity.BOTTOM)//位置
                            .setlayoutAnimaType(0)//动画类型:0自下而上动画,1淡入淡出动画
                            .setlayoutPading(20, 0, 20, 20)//与屏幕距离
                            .setOnChildViewclickListener(new DialogUtils.ViewInterface() {
                                @Override
                                public void getChildView(View view, int layoutResId) {
                                    //处理dialog内部控件的点击事件
                                    LinearLayout weichat_share_ll= view.findViewById(R.id.weichat_share_ll);
                                    weichat_share_ll.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                            Toast.makeText(MainActivity.this,"微信",Toast.LENGTH_SHORT).show();
                                        }
                                    });
                                    TextView disMissTv= view.findViewById(R.id.share_dismiss_tv);
                                    disMissTv.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                            DialogUtils.dismiss();
                                        }
                                    });
                                }
                            })
                            .show();
    

    附上两张效果图:


    523964774539518641.png 551425696019632053.png

    Demo地址:点这里

    相关文章

      网友评论

      • 张帅_9193:若加上接口,就更好了
        等风来_Android:@张帅_9193 是的,有空了看看
        张帅_9193:@等风来_Android 说道弹框 ,建议看一下AlterDialog源码 ,Builder模式(接口 、静态 )
        等风来_Android:@张帅_9193 上午做了一个分享弹窗,后来在别的地方也有用到,就简单封装一下,后续有空在添加其他的功能
      • 张帅_9193:入门级,简介,一目了然
        等风来_Android:@张帅_9193 😀

      本文标题:利用建造者模式封装一个简单好用的dialog

      本文链接:https://www.haomeiwen.com/subject/qezeeftx.html