天天看點

Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始

  封裝一個獨立彈窗Module,這裡的彈窗包括普通的Dialog方式彈框和WindowManager方式彈窗。提供一種管理項目裡面彈窗的方案,便于後期修改和維護。

  首先描述一個在大項目中普遍存在的一個現象:由于項目的功能多,負責功能的人不同,當功能中需要一個普通的确定取消對話框時,大部分人都選擇自己寫了一個,自己new一個獨立的彈窗出來。這樣做的好處有以下幾個:

  1. 代碼邏輯獨立,自己寫的代碼自己能控制
  2. 快速友善,便于修改,便于滿足各種奇怪的需求

  可是這個做法導緻項目中存在大量的代碼備援,大量的分散的彈窗,短期内一般也不會有什麼問題,如果這個時候項目要重構,要修改所有彈窗的樣式,接下來面臨幾個問題:

  1. 不知道有多少個彈窗
  2. 不知道代碼中什麼地方會有彈窗
  3. 不知道彈窗寫法都有哪些(樣式不知道,彈出的方式是Dialog還是WindowManager)
  4. 改動點多,工作量大,風險大

  本文就是針存在以上彈窗特點的項目,提供一種對話框的管理方式,提供一種比較好維護的實作方式(不一定是最好的實作方式)。由于代碼量大,本文隻講實作設計思想和實作方式,具體源碼可以直接從github下載下傳檢視,後面會提供位址。

本文實作彈窗效果動畫示範

  本文中Dialog彈窗樣式總共實作了12種,但是這個不能作為一個标準,要根據自己項目的實際情況,自己做分類,當然大部分簡單的項目用本文提供的Module就可以直接使用。

Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始

界面控制工具:http://www.cnblogs.com/popfisher/p/5996799.html

常見彈窗的實作方式

Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始

常見彈窗的實作方式分析

  這種實作方式一般是項目剛開始的時候,寫彈窗的人一般都會這樣設計,本身沒什麼問題,如果彈窗樣式少并且彈窗布局都比較規範還是可以維護的。但是實際上這兩個條件在大項目中一般都不滿足的,首先彈窗樣式肯定不少,其實為了滿足産品各種需求,彈窗布局也會不同。現象一下,就一個對話框彈窗布局裡面要容納所的彈窗樣式,也就是一個CommonDialog包含了所有的彈窗邏輯,這本身就維護了單一性原則。而且越往後越難維護,所有人都改同一個類,同一個布局,第一次經手的人估計是有點難以下手修改的。為了解決這種現象,可以用下面的方式來代替。

易維護易拓展的對話框彈窗實作方式

  WindowManager方式彈窗的設計思想與Dialog彈窗方式一樣的,隻是底層用來顯示View的地方不一樣,本文不具體講,源碼部分是包含的。

Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始

  

易維護易拓展的對話框彈窗實作方式分析

  對于上面的實作方式有如下幾個好處

  1. 通過工廠模式,外部傳入一個Type參數,使用者不需要關系實作細節,隻需要知道Type對應的布局樣式

  2. 每種Type對應一種彈窗布局,隻需要實作自己關系的接口

  3. 各種彈窗邏輯完全獨立,獨立修改,獨立維護

  使用者需要關注Type類型和需要調用對應Type彈窗的什麼方法,這裡的Type類型必須要讓使用者知道它對應什麼樣的樣式,這個比較難,代碼裡面隻能通過注釋的方式來說明了,如果比較正統化的公司可能會有文檔記錄。不過這裡也不會造成多大的困擾,使用者随很容易就測試出是不是自己要的樣式,是以使用者還是能很友善的進行使用的。

易維護易拓展的部分對話框彈窗展示

  彈窗效果實作了各種不同造型的圓角,以及按鈕支援了水波紋

Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始
Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始

易維護易拓展的對話框彈窗源碼實作與使用

1. 實作這種彈窗,需要定義好Type類型,要根據自己項目的實際情況對Type類型進行合理的分類,以下是本文的Type定義

Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始

2. Dialog彈窗使用者調用如下

final ICommonDialog dialog = CommonDialogFactory.createDialogByType(this, DialogUtil.DIALOG_TYPE_1);
dialog.setTitleText("DIALOG_TYPE_1");
dialog.setCancelBtn(R.string.cancel, new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    }
});
dialog.setOkBtn(R.string.ok, new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog.dismiss();
    }
});
dialog.setCanceledOnTouchOutside(true);
dialog.show();      

3. WindowManager彈窗Type定義

Android重構與設計之路,從整理提示彈窗(SmartAlertPop)開始

4. WindowManager彈窗使用者調用如下

final ICommonWindowPop windowPop = CommonWindowPopFactory.createWindowPopByType(this, WindowPopUtil.WINDOW_POP_TYPE_2);
windowPop.setTitleBgType(WindowPopUtil.TITLE_SAFE_BLUE);
windowPop.setTitleText("WINDOW_POP_TYPE_2");
windowPop.setContentView(R.layout.dialog_custom_content_test_layout);
windowPop.setCanceledOnTouchOutside(true);
windowPop.setCancelBtn(R.string.cancel, new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    }
});
windowPop.setOkBtn(R.string.ok, new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        windowPop.dismiss();
    }
});
windowPop.show();      

5. 源碼下載下傳位址:https://github.com/PopFisher/SmartAlertPop

總結

  本項目隻是提供一種基本的架構,具體的對話框樣式可以根據自身項目的需求而改變,可以随意添加删除修改一種類型,主要是為了統一管理項目中的彈窗,友善維護與管理。

博友回報補充點:

  如果覺得Type的方式不好使用,可以采用4樓博友imkarl提供的思路,使用多function的方式代替多type的方式。需要注意的是方法的命名要有點講究,不能太随意,否則一個項目裡面有幾十個彈窗樣式的時候也會變成一個災難。