Android Dialog层级管理器

2019-07-10  本文已影响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;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读