日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android 如何實現彈窗順序&優先級控制

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

一般在項目首頁中,往往會有多個對話框需要彈出,比如活動彈窗、更新彈窗、評分彈窗等等,而且這些彈窗是有優先級順序的。這些彈窗一般是通過接口請求后返回結果再顯示的,如果只有幾個彈窗還好處理,業務邏輯上判斷一下先后顯示就可以。如果有十幾個或者更多,那么處理起來將非常麻煩,而且容易出現問題。

所以封裝一個可以按照優先級順序顯示的彈窗功能就非常有必要,首先功能需求如下:

按優先級順序阻塞式顯示各種類型彈窗,默認從最高優先級開始顯示 只有上一個高優先級彈窗顯示完或者取消顯示,下一個低優先級彈窗才可以顯示 指定顯示某一個彈窗的前提是沒有更高優先級的彈窗需要顯示 在顯示一個彈窗之前需要判斷是否能夠或者需要顯示 根據優先級去查找指定的彈窗,優先級相當于唯一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; } 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; /** * 優先級,值越大優先級越高 */ 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類去統一組織管理彈窗的添加、顯示、關閉等邏輯,

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); } } } /** * 展示彈窗 * 從優先級最高的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 是否同時dismiss掉彈窗管理者維護的彈窗 */ 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(); } /** * 展示下一個優先級最大的Window */ private synchronized void showNext(Activity activity) { WindowWrapper windowWrapper = getMaxPriorityWindow(); if (windowWrapper != null && windowWrapper.isCanShow()) { if (windowWrapper.getWindow() != null) {windowWrapper.getWindow().show(activity); } } } /** * 獲取當前棧中優先級最高的Window(優先級相同則返回后添加的彈窗) */ 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; } /** * 獲取當前處于show狀態的彈窗 */ 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類有三個主要方法:

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

需要按順序顯示的對話框統一使用addWindow方法添加,這是還未進行網絡請求之前就要調用的。作用是告訴WindowTaskManager一共有多少個彈窗需要按順序顯示。當網絡請求返回之后,如果需要顯示彈窗就調用enableWindow方法去顯示,如果不需要顯示彈窗就調用disableWindow方法,將這個彈窗從顯示隊列中移除。

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

項目地址:github.com/Geekince/Pr…

彩蛋:

需要在DialogFragment中顯示DialogFragment時候,最好不要直接在DialogFragment啟動顯示,而是在DialogFragment的消失回調中啟動顯示。因為當前一個DialogFragment消失的時候,getChildFragmentManager可能會失效,應該在外層使用getFragmentManager。

以上就是Android 如何實現彈窗順序&優先級控制的詳細內容,更多關于Android 實現彈窗順序和優先級控制的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品免费在线| 91一区二区三区四区| 中文字幕av一区二区三区四区| 日本一区福利在线| 卡一卡二国产精品| 亚洲播播91| 免费的成人av| 精品资源在线| 在线视频免费在线观看一区二区| 日韩欧美三区| 精品美女视频 | 久久超级碰碰| 91精品一区国产高清在线gif| 蜜臀av国产精品久久久久| 日本午夜免费一区二区| 日韩亚洲一区在线| 中文不卡在线| 97在线精品| 午夜久久av | 日韩一区二区三免费高清在线观看 | 久久97视频| 日韩在线二区| 在线亚洲一区| 欧美在线看片| 中文在线免费视频| 久久国产精品99国产| 日本精品一区二区三区在线观看视频| 亚洲无线一线二线三线区别av| 亚洲高清不卡| 麻豆一区二区三| 亚洲一区二区三区高清不卡| 精品视频高潮| 蜜臀久久久久久久| 日韩欧美精品综合| 久久精品 人人爱| 亚洲少妇自拍| 成人一区而且| 日韩av在线免费观看不卡| 999国产精品视频| 国产美女亚洲精品7777| 在线成人直播| 老牛国内精品亚洲成av人片| 日韩视频一区| 成人av三级| 国产欧美日韩一区二区三区四区| 99国产精品视频免费观看一公开 | 国产精品第一国产精品| 亚洲尤物在线| 成人羞羞在线观看网站| 国产精品手机在线播放| 免费久久99精品国产| www.com.cn成人| 国产伦精品一区二区三区在线播放 | 亚洲理论在线| 亚洲日本网址| 麻豆极品一区二区三区| 中文字幕免费精品| 欧美日韩国产综合网| 特黄特色欧美大片| 亚洲欧洲日韩| 国产亚洲一区二区手机在线观看 | 在线一区二区三区视频| 精品国产亚洲一区二区三区在线 | 久久国产视频网| 久热精品在线| 亚洲无线一线二线三线区别av| 国产一区2区在线观看| 国产日韩欧美三区| 亚洲精品美女| 亚洲视频国产精品| 91久久视频| 国产99亚洲| 91一区二区| 精品一区二区三区中文字幕| 国产欧美一区二区色老头| 色狠狠一区二区三区| 中文字幕中文字幕精品| 久久亚洲电影| 日韩精品一区第一页| 日韩午夜黄色| 日韩午夜精品| 亚洲欧美日韩国产一区| 夜久久久久久| 亚洲在线电影| 老牛影视一区二区三区| 亚洲欧美不卡| 一区二区三区午夜视频| 日韩精品一二三| 亚洲一区亚洲| 蜜臀久久99精品久久久久久9| 久久夜色精品| 亚洲精品观看| 欧美日韩一视频区二区| 日韩av二区在线播放| 日韩激情视频网站| 91麻豆精品激情在线观看最新 | 国产成人精品一区二区三区免费| 久久精品人人| 欧美国产小视频| 亚洲精品自拍| 午夜一区在线| 国产一区国产二区国产三区 | 97久久超碰| 首页亚洲欧美制服丝腿| 欧美一区三区| 成人精品视频| 久久免费视频66| 国产精品久久久一区二区| 美女视频黄久久| 日韩免费视频| 伊人精品视频| 不卡一区2区| 视频一区视频二区中文| 亚洲精品系列| 国产精品sm| 日产精品一区二区| 国产精品99一区二区| 欧美日韩激情| 久久亚洲国产精品一区二区| 色综合视频一区二区三区日韩 | 国产精品网站在线看| 欧美极品一区二区三区| 久久影视三级福利片| 国产资源在线观看入口av| 91久久久精品国产| 日韩毛片一区| 精品国产亚洲一区二区三区在线| 日韩在线高清| 美女久久久久久| 好看不卡的中文字幕| 亚洲免费精品| 日韩二区在线观看| 精品视频高潮| 欧美高清一区| 亚洲91在线| 91亚洲一区| 妖精视频成人观看www| 日韩av一区二| 亚洲国产欧美日本视频| 91九色精品| 欧美性www| 神马日本精品| 日韩中文字幕| 欧洲一区二区三区精品| 视频一区中文| 激情黄产视频在线免费观看| 香蕉久久99| 综合日韩在线| 久久精品色播| 久久久久久久久99精品大| 夜夜精品视频| 日韩二区三区四区| 久久精品国产免费| 久久精品亚洲人成影院| 蜜臀va亚洲va欧美va天堂| 国产精品资源| 日韩一区亚洲二区| 视频在线在亚洲| 国产精品草草| 亚洲精品护士| 91精品视频一区二区| 亚洲手机视频| 亚洲九九精品| 亚洲ab电影| 免费在线观看日韩欧美| 国产精品精品| 欧美日韩中文| 久久亚洲一区| 亚洲精品小说| 婷婷成人在线| 日韩电影免费在线观看| 欧美日韩国产高清| 樱桃视频成人在线观看| 欧美亚洲精品在线| 国产亚洲电影| 久久久久网站| 欧美中文高清| 好吊日精品视频| 国产精品蜜芽在线观看| 91精品日本| 日韩视频二区| 国产精品专区免费| 亚洲天堂av资源在线观看| 久久久777| 精品久久亚洲| 久久精品72免费观看| 久久99伊人| 欧美亚洲国产激情| 国产成人精品三级高清久久91| 婷婷综合福利| 亚洲一区二区三区高清不卡| 亚洲成av在线| 国产精品啊v在线| 日韩影片在线观看| 亚洲欧美日韩国产| 美女少妇全过程你懂的久久| 麻豆国产精品| 日韩avvvv在线播放| 国产极品久久久久久久久波多结野 | 深夜福利视频一区二区|