一般在项目首页中,往往会有多个对话框需要弹出,比如活动弹窗、更新弹窗、评分弹窗等等,而且这些弹窗是有优先级顺序的。这些弹窗一般是通过接口请求后返回结果再显示的,如果只有几个弹窗还好处理,业务逻辑上判断一下先后显示就可以。如果有十几个或者更多,那么处理起来将非常麻烦,而且容易出现问题。
所以封装一个可以按照优先级顺序显示的弹窗功能就非常有必要,首先功能需求如下:
按优先级顺序阻塞式显示各种类型弹窗,默认从最高优先级开始显示
只有上一个高优先级弹窗显示完或者取消显示,下一个低优先级弹窗才可以显示
指定显示某一个弹窗的前提是没有更高优先级的弹窗需要显示
在显示一个弹窗之前需要判断是否能够或者需要显示
根据优先级去查找指定的弹窗,优先级相当于唯一ID
弹窗包括多种类型,Dialog、PopupWindow、Activity等等
接着开始编码去实现功能,先定一个枚举类,罗列出支持的弹窗类型,包括Dialog、PopupWindow、Activity等等。
public enum WindowType {
DIALOG,
POUPOWINDOW,
TOAST,
SNACKBAR,
WIDGET,
ACTIVITY,
OTHERS
}
然后定义弹窗接口IWindow,它定义了弹窗的基本功能。
/**
* 窗口约定规则
*/
public interface IWindow {
/**
* 弹窗展示
*/
void show(Activity activity);
/**
* 弹窗关闭
*/
void dismiss();
/**
* 设置窗口关闭监听
*/
void setOnWindowDismissListener(OnWindowDismissListener listener);
/**
* 设置窗口展示监听
*/
void setOnWindowShowListener(OnWindowShowListener listener);
}
以及弹窗显示和关闭的监听接口,
/**
* 窗口关闭监听
*/
public interface OnWindowDismissListener {
/**
*
*/
void onDismiss();
}
/**
* 窗口展示监听
*/
public interface OnWindowShowListener {
void onShow();
}
接下来定义个包裹类WindowWrapper去封装弹窗相关的属性和状态,包括弹窗、优先级、能否显示、窗体类型等等,在处理弹窗显示逻辑时将会用到。
/**
* 窗口参数类
*/
public class WindowWrapper {
/**
* 窗口
*/
private IWindow mWindow;
/**
* 优先级,值越大优先级越高
*/
private int mPriority;
/**
* 当前是否处于show状态
*/
private boolean isShowing;
/**
* 是否满足show的条件
*/
private boolean isCanShow;
/**
* 弹窗类型
*/
private WindowType mWindowType;
/**
* 弹窗名称
*/
private String mWindowName;
private WindowWrapper(Builder builder) {
mWindow = builder.window;
mPriority = builder.priority;
mWindowType = builder.windowType;
isCanShow = builder.isCanShow;
mWindowName = builder.windowName;
}
public IWindow getWindow() {
return mWindow;
}
public void setWindow(IWindow window) {
this.mWindow = window;