封裝一個獨立彈窗Module,這裏的彈窗包括普通的Dialog方式彈框和WindowManager方式彈窗。提供一種管理項目裏面彈窗的方案,便於後期修改和維護。html
首先描述一個在大項目中廣泛存在的一個現象:因爲項目的功能多,負責功能的人不一樣,當功能中須要一個普通的肯定取消對話框時,大部分人都選擇本身寫了一個,本身new一個獨立的彈窗出來。這樣作的好處有如下幾個:git
但是這個作法致使項目中存在大量的代碼冗餘,大量的分散的彈窗,短時間內通常也不會有什麼問題,若是這個時候項目要重構,要修改全部彈窗的樣式,接下來面臨幾個問題:github
本文就是針存在以上彈窗特色的項目,提供一種對話框的管理方式,提供一種比較好維護的實現方式(不必定是最好的實現方式)。因爲代碼量大,本文只講實現設計思想和實現方式,具體源碼能夠直接從github下載查看,後面會提供地址。框架
本文實現彈窗效果動畫演示ide
本文中Dialog彈窗樣式總共實現了12種,可是這個不能做爲一個標準,要根據本身項目的實際狀況,本身作分類,固然大部分簡單的項目用本文提供的Module就能夠直接使用。工具
界面控制工具:http://www.cnblogs.com/popfisher/p/5996799.html佈局
常見彈窗的實現方式測試
常見彈窗的實現方式分析動畫
這種實現方式通常是項目剛開始的時候,寫彈窗的人通常都會這樣設計,自己沒什麼問題,若是彈窗樣式少而且彈窗佈局都比較規範仍是能夠維護的。可是實際上這兩個條件在大項目中通常都不知足的,首先彈窗樣式確定很多,其實爲了知足產品各類需求,彈窗佈局也會不一樣。現象一下,就一個對話框彈窗佈局裏面要容納所的彈窗樣式,也就是一個CommonDialog包含了全部的彈窗邏輯,這自己就維護了單一性原則。並且越日後越難維護,全部人都改同一個類,同一個佈局,第一次經手的人估計是有點難如下手修改的。爲了解決這種現象,能夠用下面的方式來代替。this
易維護易拓展的對話框彈窗實現方式
WindowManager方式彈窗的設計思想與Dialog彈窗方式同樣的,只是底層用來顯示View的地方不同,本文不具體講,源碼部分是包含的。
易維護易拓展的對話框彈窗實現方式分析
對於上面的實現方式有以下幾個好處
1. 經過工廠模式,外部傳入一個Type參數,使用者不須要關係實現細節,只須要知道Type對應的佈局樣式
2. 每種Type對應一種彈窗佈局,只須要實現本身關係的接口
3. 各類彈窗邏輯徹底獨立,獨立修改,獨立維護
使用者須要關注Type類型和須要調用對應Type彈窗的什麼方法,這裏的Type類型必需要讓使用者知道它對應什麼樣的樣式,這個比較難,代碼裏面只能經過註釋的方式來講明瞭,若是比較正統化的公司可能會有文檔記錄。不過這裏也不會形成多大的困擾,使用者隨很容易就測試出是否是本身要的樣式,因此使用者仍是能很方便的進行使用的。
易維護易拓展的部分對話框彈窗展現
彈窗效果實現了各類不一樣造型的圓角,以及按鈕支持了水波紋
易維護易拓展的對話框彈窗源碼實現與使用
1. 實現這種彈窗,須要定義好Type類型,要根據本身項目的實際狀況對Type類型進行合理的分類,如下是本文的Type定義
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定義
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的方式。須要注意的是方法的命名要有點講究,不能太隨意,不然一個項目裏面有幾十個彈窗樣式的時候也會變成一個災難。