美文网首页
Android Dialog层级管理器

Android Dialog层级管理器

作者: 懒人改变世界_ | 来源:发表于2019-07-10 11:35 被阅读0次

    情景:

    有时我们会有一个页面弹出多个弹窗的需求,那么按照系统的规则是,后弹出的弹窗会覆盖在之前的弹窗上面。但我们产品的需求是希望相对而言比较重要的弹窗放在最上面,第一眼就给用户看到。那么Dialog层级管理器就由此诞生了。

    Dialog层级管理器使用起来很简单

    具体使用代码如下:
    DialogManage dialogManage = new DialogManage();
    Dialog dialog = new Dialog(this);
    //addDialog方法第一个参数dialog,第二个优先级,值越大显示越优先
    dialogManage.addDialog(dialog, 3);
    
    注意一点这里的dialog就不用掉show方法了,显示交给Dialog层级管理器来处理

    Dialog层级管理器内部代码,附详细注释

    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.view.View;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * ================================================
     * 作    者:轻风
     * 版    本:1.0
     * 创建日期:2017/12/27 13:36
     * 描    述:Dialog管理器,可以任意时间添加dialog进来
     * 优点:可以按优先级来显示弹窗
     * ================================================
     */
    public class DialogManage {
    
        private List<DialogBean> dialogList = new ArrayList<>();//还未显示的dialog的list,这里是无序的
        private List<DialogBean> currentDialogList = new ArrayList<>();//当前显示的dialog的list,最后一个就是显示在最上面的,是按优先级正序的。这里需要理解下,因为只有比上一个dialog优先级高的时候,才会显示并加入到这个list。
    
        public DialogManage() {
    
        }
    
        /**
         * 添加一个dialog,什么时候显示dialog交给DialogManage来管理
         * 默认最低优先级
         * @param dialog
         */
        public void addDialog(Dialog dialog) {
            if(dialog!=null){
                DialogBean dialogBean = new DialogBean();
                dialogBean.setDialog(dialog);
                dialogBean.setDialogView(dialog.getWindow().getDecorView());
                show(dialogBean);
            }
        }
    
        /**
         * 添加一个dialog,什么时候显示dialog交给DialogManage来管理
         * @param dialog
         * @param priority 优先级
         */
        public void addDialog(Dialog dialog, int priority) {
            if(dialog!=null) {
                DialogBean dialogBean = new DialogBean();
                dialogBean.setDialog(dialog);
                dialogBean.setDialogView(dialog.getWindow().getDecorView());
                dialogBean.setPriority(priority);
                show(dialogBean);
            }
        }
    
        private void show(final DialogBean newDialog) {
            //都需要设置监听
            newDialog.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) {
                    currentDialogList.remove(newDialog);//关闭后从显示列表上删除
                    nextDialog();
                }
            });
    
            //先计算出要弹出的弹窗
            if (currentDialogList.size() == 0) {//没有弹窗显示时
                //直接显示新的dialog
                newDialog.getDialog().show();
                currentDialogList.add(newDialog);//加入到已显示的列表
            } else {//有弹窗显示时
                if (newDialog.getPriority() > currentDialogList.get(currentDialogList.size() - 1).getPriority()) {//优先级高于当前显示的dialog
                    //显示新的dialog
                    newDialog.getDialog().show();
                    //之前显示的弹窗暂时隐藏掉
                    currentDialogList.get(currentDialogList.size() - 1).getDialogView().setVisibility(View.INVISIBLE);
                    currentDialogList.add(newDialog);//加入到已显示的列表
                } else {//优先级和当前的dialog相等或者低于当前
                    dialogList.add(newDialog);//加入到待显示列表
                }
            }
        }
    
        /**
         * 计算得出下一个要展示的dialog
         */
        private void nextDialog() {
            //未显示列表里无dialog时
            if (dialogList.size() == 0) {
                //显示列表不为空时
                if (currentDialogList.size() > 0) {
                    //继续展示之前已经展示出来的
                    currentDialogList.get(currentDialogList.size()-1).getDialogView().setVisibility(View.VISIBLE);
                }else {
                    //显示列表为空时
                    //不做处理
                }
            }
            //未显示列表里有dialog时
            else {
                //显示列表不为空时
                if (currentDialogList.size() > 0) {
                    //1、先拿取已显示list里优先级最高的
                    DialogBean currentDialogBean = currentDialogList.get(currentDialogList.size() - 1);//最后一个就是优先级最高的
                    //2、再拿取未显示list里优先级最高的
                    DialogBean notShowDialogBean = dialogList.get(0);
                    for (int i = 0; i < dialogList.size(); i++) {
                        if (notShowDialogBean.getPriority() < dialogList.get(i).getPriority()) {
                            notShowDialogBean = dialogList.get(i);
                        }
                    }
                    //3、对比出优先级最高的,如果优先级一样。那么依旧显示之前显示的
                    //4、显示优先级较高的
                    if (currentDialogBean.getPriority() < notShowDialogBean.getPriority()) {//未展示的优先级较高
                        notShowDialogBean.getDialog().show();//展示未展示的
                        currentDialogList.add(notShowDialogBean);//加入到展示列表里
                        dialogList.remove(notShowDialogBean);//从未显示列表里删除
                    } else {
                        //继续展示之前已经展示出来的
                        currentDialogList.get(currentDialogList.size()-1).getDialogView().setVisibility(View.VISIBLE);
                    }
                } else {
                    //显示列表为空时
                    //1、再拿取未显示list里优先级最高的
                    DialogBean notShowDialogBean = dialogList.get(0);
                    for (int i = 0; i < dialogList.size(); i++) {
                        if (notShowDialogBean.getPriority() < dialogList.get(i).getPriority()) {
                            notShowDialogBean = dialogList.get(i);
                        }
                    }
    
                    //2、显示优先级较高的
                    notShowDialogBean.getDialog().show();
                    currentDialogList.add(notShowDialogBean);//加入到展示列表里
                    dialogList.remove(notShowDialogBean);//从未显示列表里删除
                }
            }
        }
    
        public static class DialogBean {
            private Dialog dialog;
            private View dialogView;//dialog的view
            private int priority;//优先级
    
            public Dialog getDialog() {
                return dialog;
            }
    
            public void setDialog(Dialog dialog) {
                this.dialog = dialog;
            }
    
            public View getDialogView() {
                return dialogView;
            }
    
            public void setDialogView(View dialogView) {
                this.dialogView = dialogView;
            }
    
            public int getPriority() {
                return priority;
            }
    
            public void setPriority(int priority) {
                this.priority = priority;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Android Dialog层级管理器

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