电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Android 如何實(shí)現(xiàn)彈窗順序&優(yōu)先級(jí)控制

瀏覽:5日期:2022-09-20 09:06:29

一般在項(xiàng)目首頁中,往往會(huì)有多個(gè)對(duì)話框需要彈出,比如活動(dòng)彈窗、更新彈窗、評(píng)分彈窗等等,而且這些彈窗是有優(yōu)先級(jí)順序的。這些彈窗一般是通過接口請(qǐng)求后返回結(jié)果再顯示的,如果只有幾個(gè)彈窗還好處理,業(yè)務(wù)邏輯上判斷一下先后顯示就可以。如果有十幾個(gè)或者更多,那么處理起來將非常麻煩,而且容易出現(xiàn)問題。

所以封裝一個(gè)可以按照優(yōu)先級(jí)順序顯示的彈窗功能就非常有必要,首先功能需求如下:

按優(yōu)先級(jí)順序阻塞式顯示各種類型彈窗,默認(rèn)從最高優(yōu)先級(jí)開始顯示 只有上一個(gè)高優(yōu)先級(jí)彈窗顯示完或者取消顯示,下一個(gè)低優(yōu)先級(jí)彈窗才可以顯示 指定顯示某一個(gè)彈窗的前提是沒有更高優(yōu)先級(jí)的彈窗需要顯示 在顯示一個(gè)彈窗之前需要判斷是否能夠或者需要顯示 根據(jù)優(yōu)先級(jí)去查找指定的彈窗,優(yōu)先級(jí)相當(dāng)于唯一ID 彈窗包括多種類型,Dialog、PopupWindow、Activity等等

接著開始編碼去實(shí)現(xiàn)功能,先定一個(gè)枚舉類,羅列出支持的彈窗類型,包括Dialog、PopupWindow、Activity等等。

public enum WindowType { DIALOG, POUPOWINDOW, TOAST, SNACKBAR, WIDGET, ACTIVITY, OTHERS}

然后定義彈窗接口IWindow,它定義了彈窗的基本功能。

/*** 窗口約定規(guī)則*/public interface IWindow { /** * 彈窗展示 */ void show(Activity activity); /** * 彈窗關(guān)閉 */ void dismiss(); /** * 設(shè)置窗口關(guān)閉監(jiān)聽 */ void setOnWindowDismissListener(OnWindowDismissListener listener); /** * 設(shè)置窗口展示監(jiān)聽 */ void setOnWindowShowListener(OnWindowShowListener listener);}

以及彈窗顯示和關(guān)閉的監(jiān)聽接口,

/*** 窗口關(guān)閉監(jiān)聽*/public interface OnWindowDismissListener { /** * */ void onDismiss();}/*** 窗口展示監(jiān)聽*/public interface OnWindowShowListener { void onShow();}

接下來定義個(gè)包裹類WindowWrapper去封裝彈窗相關(guān)的屬性和狀態(tài),包括彈窗、優(yōu)先級(jí)、能否顯示、窗體類型等等,在處理彈窗顯示邏輯時(shí)將會(huì)用到。

/*** 窗口參數(shù)類*/public class WindowWrapper { /** * 窗口 */ private IWindow mWindow; /** * 優(yōu)先級(jí),值越大優(yōu)先級(jí)越高 */ private int mPriority; /** * 當(dāng)前是否處于show狀態(tài) */ 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; } public int getPriority() { return mPriority; } public void setPriority(int priority) { this.mPriority = priority; } public boolean isShowing() { return isShowing; } public void setShowing(boolean showing) { isShowing = showing; } public WindowType getWindowType() { return mWindowType; } public void setWindowType(WindowType mWindowType) { this.mWindowType = mWindowType; } public boolean isCanShow() { return isCanShow; } public void setCanShow(boolean canShow) { isCanShow = canShow; } public String getWindowName() { return mWindowName; } public void setWindowName(String mWindowName) { this.mWindowName = mWindowName; } public static class Builder { /** * 窗口 */ private IWindow window; /** * 優(yōu)先級(jí),值越大優(yōu)先級(jí)越高 */ private int priority; /** * 彈窗類型 */ private WindowType windowType; /** * 是否滿足show的條件 */ private boolean isCanShow; /** * 彈窗名稱 */ private String windowName; public Builder window(IWindow window) { this.window = window; return this; } public Builder priority(int priority) { this.priority = priority; return this; } public Builder windowType(WindowType type) { this.windowType = type; return this; } public Builder setCanShow(boolean canShow) { isCanShow = canShow; return this; } public String getWindowName() { return windowName; } public Builder setWindowName(String windowName) { this.windowName = windowName; return this; } public WindowWrapper build() { return new WindowWrapper(this); } }}

最后通過WindowTaskManager類去統(tǒng)一組織管理彈窗的添加、顯示、關(guān)閉等邏輯,

public class WindowTaskManager { private List<WindowWrapper> mWindows; private static WindowTaskManager mDefaultInstance; private WindowTaskManager() { } /** * 獲取彈窗管理者 */ public static WindowTaskManager getInstance() { if (mDefaultInstance == null) { synchronized (WindowTaskManager.class) {if (mDefaultInstance == null) { mDefaultInstance = new WindowTaskManager();} } } return mDefaultInstance; } /** * 添加彈窗 * * @param windowWrapper 待顯示的彈窗 */ public synchronized void addWindow(Activity activity, WindowWrapper windowWrapper) { if (windowWrapper != null) { if (mWindows == null) {mWindows = new ArrayList<>(); } if (windowWrapper.getWindow() != null) {windowWrapper.getWindow().setOnWindowShowListener(new OnWindowShowListener() { @Override public void onShow() { windowWrapper.setShowing(true); }});windowWrapper.getWindow().setOnWindowDismissListener(new OnWindowDismissListener() { @Override public void onDismiss() { windowWrapper.setShowing(false); mWindows.remove(windowWrapper); showNext(activity); }}); } mWindows.add(windowWrapper); } } /** * 彈窗滿足展示條件 * * @param priority */ public synchronized void enableWindow(Activity activity, int priority, IWindow window) { WindowWrapper windowWrapper = getTargetWindow(priority); if (windowWrapper != null) { if (windowWrapper.getWindow() == null) {window.setOnWindowShowListener(new OnWindowShowListener() { @Override public void onShow() { windowWrapper.setShowing(true); }});window.setOnWindowDismissListener(new OnWindowDismissListener() { @Override public void onDismiss() { windowWrapper.setShowing(false); mWindows.remove(windowWrapper); showNext(activity); }}); } windowWrapper.setCanShow(true); windowWrapper.setWindow(window); show(activity, priority); } } /** * 移除不需要顯示彈窗 * * @param priority */ public synchronized void disableWindow(int priority) { WindowWrapper windowWrapper = getTargetWindow(priority); if (windowWrapper != null && windowWrapper.getWindow() != null) { if (mWindows != null) {mWindows.remove(windowWrapper); } } } /** * 展示彈窗 * 從優(yōu)先級(jí)最高的Window開始顯示 */ public synchronized void show(Activity activity) { WindowWrapper windowWrapper = getMaxPriorityWindow(); if (windowWrapper != null && windowWrapper.isCanShow()) { IWindow window = windowWrapper.getWindow(); if (window != null) {window.show(activity); } } } /** * 顯示指定的彈窗 * * @param priorities */ public synchronized void show(Activity activity, int priorities) { WindowWrapper windowWrapper = getTargetWindow(priorities); if (windowWrapper != null && windowWrapper.getWindow() != null) { WindowWrapper topShowWindow = getShowingWindow(); if (topShowWindow == null) {int priority = windowWrapper.getPriority();WindowWrapper maxPriorityWindow = getMaxPriorityWindow();if (maxPriorityWindow != null && windowWrapper.isCanShow() && priority >= maxPriorityWindow.getPriority()) { if (windowWrapper.getWindow() != null) { windowWrapper.getWindow().show(activity); }} } } } /** * 清除彈窗管理者 */ public synchronized void clear() { if (mWindows != null) { for (int i = 0, size = mWindows.size(); i < size; i++) {if (mWindows.get(i) != null) { IWindow window = mWindows.get(i).getWindow(); if (window != null) { window.dismiss(); }} } mWindows.clear(); } WindowHelper.getInstance().onDestroy(); } /** * 清除彈窗管理者 * * @param dismiss 是否同時(shí)dismiss掉彈窗管理者維護(hù)的彈窗 */ public synchronized void clear(boolean dismiss) { if (mWindows != null) { if (dismiss) {for (int i = 0, size = mWindows.size(); i < size; i++) { if (mWindows.get(i) != null) { IWindow window = mWindows.get(i).getWindow(); if (window != null) { window.dismiss(); } }} } mWindows.clear(); } WindowHelper.getInstance().onDestroy(); } /** * 展示下一個(gè)優(yōu)先級(jí)最大的Window */ private synchronized void showNext(Activity activity) { WindowWrapper windowWrapper = getMaxPriorityWindow(); if (windowWrapper != null && windowWrapper.isCanShow()) { if (windowWrapper.getWindow() != null) {windowWrapper.getWindow().show(activity); } } } /** * 獲取當(dāng)前棧中優(yōu)先級(jí)最高的Window(優(yōu)先級(jí)相同則返回后添加的彈窗) */ private synchronized WindowWrapper getMaxPriorityWindow() { if (mWindows != null) { int maxPriority = -1; int position = -1; for (int i = 0, size = mWindows.size(); i < size; i++) {WindowWrapper windowWrapper = mWindows.get(i);if (i == 0) { position = 0; maxPriority = windowWrapper.getPriority();} else { if (windowWrapper.getPriority() >= maxPriority) { position = i; maxPriority = windowWrapper.getPriority(); }} } if (position != -1) {return mWindows.get(position); } else {return null; } } return null; } private synchronized WindowWrapper getTargetWindow(int priority) { if (mWindows != null) { for (int i = 0, size = mWindows.size(); i < size; i++) {WindowWrapper windowWrapper = mWindows.get(i);if (windowWrapper != null && windowWrapper.getPriority() == priority) { return windowWrapper;} } } return null; } /** * 獲取當(dāng)前處于show狀態(tài)的彈窗 */ private synchronized WindowWrapper getShowingWindow() { if (mWindows != null) { for (int i = 0, size = mWindows.size(); i < size; i++) {WindowWrapper windowWrapper = mWindows.get(i);if (windowWrapper != null && windowWrapper.getWindow() != null && windowWrapper.isShowing()) { return windowWrapper;} } } return null; }}

WindowTaskManager類有三個(gè)主要方法:

addWindow(Activity activity, WindowWrapper windowWrapper) enableWindow(Activity activity, int priority, IWindow window) disableWindow(int priority)

需要按順序顯示的對(duì)話框統(tǒng)一使用addWindow方法添加,這是還未進(jìn)行網(wǎng)絡(luò)請(qǐng)求之前就要調(diào)用的。作用是告訴WindowTaskManager一共有多少個(gè)彈窗需要按順序顯示。當(dāng)網(wǎng)絡(luò)請(qǐng)求返回之后,如果需要顯示彈窗就調(diào)用enableWindow方法去顯示,如果不需要顯示彈窗就調(diào)用disableWindow方法,將這個(gè)彈窗從顯示隊(duì)列中移除。

以上就是按順序顯示彈窗的主要邏輯,使用的話窗體先繼承IWindow,實(shí)現(xiàn)相關(guān)方法。然后通過操作WindowTaskManager類就可以了。具體使用方法參見源碼。

項(xiàng)目地址:github.com/Geekince/Pr…

彩蛋:

需要在DialogFragment中顯示DialogFragment時(shí)候,最好不要直接在DialogFragment啟動(dòng)顯示,而是在DialogFragment的消失回調(diào)中啟動(dòng)顯示。因?yàn)楫?dāng)前一個(gè)DialogFragment消失的時(shí)候,getChildFragmentManager可能會(huì)失效,應(yīng)該在外層使用getFragmentManager。

以上就是Android 如何實(shí)現(xiàn)彈窗順序&優(yōu)先級(jí)控制的詳細(xì)內(nèi)容,更多關(guān)于Android 實(shí)現(xiàn)彈窗順序和優(yōu)先級(jí)控制的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 薪动-人力资源公司-灵活用工薪资代发-费用结算-残保金优化-北京秒付科技有限公司 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 对夹式止回阀厂家,温州对夹式止回阀制造商--永嘉县润丰阀门有限公司 | 薄壁轴承-等截面薄壁轴承生产厂家-洛阳薄壁精密轴承有限公司 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折! | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 实体店商新零售|微赢|波后|波后合作|微赢集团 | 苏州柯瑞德货架-仓库自动化改造解决方案 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 电主轴-高速精密电主轴-高速电机厂家-瑞德沃斯品牌有限公司 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 压力变送器-上海武锐自动化设备有限公司 | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 | 二手色谱仪器,十万分之一分析天平,蒸发光检测器,电位滴定仪-湖北捷岛科学仪器有限公司 | 高低温试验房-深圳高低温湿热箱-小型高低温冲击试验箱-爱佩试验设备 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 超声波反应釜【百科】-以马内利仪器 | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 建筑资质代办-建筑资质转让找上海国信启航 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 |