情景:
有時(shí)我們會有一個(gè)頁面彈出多個(gè)彈窗的需求,那么按照系統(tǒng)的規(guī)則是,后彈出的彈窗會覆蓋在之前的彈窗上面则披。但我們產(chǎn)品的需求是希望相對而言比較重要的彈窗放在最上面搂誉,第一眼就給用戶看到较剃。那么Dialog層級管理器就由此誕生了咕别。
Dialog層級管理器使用起來很簡單
具體使用代碼如下:
DialogManage dialogManage = new DialogManage();
Dialog dialog = new Dialog(this);
//addDialog方法第一個(gè)參數(shù)dialog,第二個(gè)優(yōu)先級写穴,值越大顯示越優(yōu)先
dialogManage.addDialog(dialog, 3);
注意一點(diǎn)這里的dialog就不用掉show方法了惰拱,顯示交給Dialog層級管理器來處理
Dialog層級管理器內(nèi)部代碼,附詳細(xì)注釋
import android.app.Dialog;
import android.content.DialogInterface;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
/**
* ================================================
* 作 者:輕風(fēng)
* 版 本:1.0
* 創(chuàng)建日期:2017/12/27 13:36
* 描 述:Dialog管理器,可以任意時(shí)間添加dialog進(jìn)來
* 優(yōu)點(diǎn):可以按優(yōu)先級來顯示彈窗
* ================================================
*/
public class DialogManage {
private List<DialogBean> dialogList = new ArrayList<>();//還未顯示的dialog的list偿短,這里是無序的
private List<DialogBean> currentDialogList = new ArrayList<>();//當(dāng)前顯示的dialog的list馋没,最后一個(gè)就是顯示在最上面的,是按優(yōu)先級正序的篷朵。這里需要理解下,因?yàn)橹挥斜壬弦粋€(gè)dialog優(yōu)先級高的時(shí)候笔链,才會顯示并加入到這個(gè)list鉴扫。
public DialogManage() {
}
/**
* 添加一個(gè)dialog澈缺,什么時(shí)候顯示dialog交給DialogManage來管理
* 默認(rèn)最低優(yōu)先級
* @param dialog
*/
public void addDialog(Dialog dialog) {
if(dialog!=null){
DialogBean dialogBean = new DialogBean();
dialogBean.setDialog(dialog);
dialogBean.setDialogView(dialog.getWindow().getDecorView());
show(dialogBean);
}
}
/**
* 添加一個(gè)dialog,什么時(shí)候顯示dialog交給DialogManage來管理
* @param dialog
* @param priority 優(yōu)先級
*/
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) {
//都需要設(shè)置監(jiān)聽
newDialog.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
currentDialogList.remove(newDialog);//關(guān)閉后從顯示列表上刪除
nextDialog();
}
});
//先計(jì)算出要彈出的彈窗
if (currentDialogList.size() == 0) {//沒有彈窗顯示時(shí)
//直接顯示新的dialog
newDialog.getDialog().show();
currentDialogList.add(newDialog);//加入到已顯示的列表
} else {//有彈窗顯示時(shí)
if (newDialog.getPriority() > currentDialogList.get(currentDialogList.size() - 1).getPriority()) {//優(yōu)先級高于當(dāng)前顯示的dialog
//顯示新的dialog
newDialog.getDialog().show();
//之前顯示的彈窗暫時(shí)隱藏掉
currentDialogList.get(currentDialogList.size() - 1).getDialogView().setVisibility(View.INVISIBLE);
currentDialogList.add(newDialog);//加入到已顯示的列表
} else {//優(yōu)先級和當(dāng)前的dialog相等或者低于當(dāng)前
dialogList.add(newDialog);//加入到待顯示列表
}
}
}
/**
* 計(jì)算得出下一個(gè)要展示的dialog
*/
private void nextDialog() {
//未顯示列表里無dialog時(shí)
if (dialogList.size() == 0) {
//顯示列表不為空時(shí)
if (currentDialogList.size() > 0) {
//繼續(xù)展示之前已經(jīng)展示出來的
currentDialogList.get(currentDialogList.size()-1).getDialogView().setVisibility(View.VISIBLE);
}else {
//顯示列表為空時(shí)
//不做處理
}
}
//未顯示列表里有dialog時(shí)
else {
//顯示列表不為空時(shí)
if (currentDialogList.size() > 0) {
//1、先拿取已顯示list里優(yōu)先級最高的
DialogBean currentDialogBean = currentDialogList.get(currentDialogList.size() - 1);//最后一個(gè)就是優(yōu)先級最高的
//2依沮、再拿取未顯示list里優(yōu)先級最高的
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杖们、對比出優(yōu)先級最高的摘完,如果優(yōu)先級一樣傻谁。那么依舊顯示之前顯示的
//4、顯示優(yōu)先級較高的
if (currentDialogBean.getPriority() < notShowDialogBean.getPriority()) {//未展示的優(yōu)先級較高
notShowDialogBean.getDialog().show();//展示未展示的
currentDialogList.add(notShowDialogBean);//加入到展示列表里
dialogList.remove(notShowDialogBean);//從未顯示列表里刪除
} else {
//繼續(xù)展示之前已經(jīng)展示出來的
currentDialogList.get(currentDialogList.size()-1).getDialogView().setVisibility(View.VISIBLE);
}
} else {
//顯示列表為空時(shí)
//1谈飒、再拿取未顯示list里優(yōu)先級最高的
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杭措、顯示優(yōu)先級較高的
notShowDialogBean.getDialog().show();
currentDialogList.add(notShowDialogBean);//加入到展示列表里
dialogList.remove(notShowDialogBean);//從未顯示列表里刪除
}
}
}
public static class DialogBean {
private Dialog dialog;
private View dialogView;//dialog的view
private int priority;//優(yōu)先級
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;
}
}
}