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;
}
}
}