封装一个独立弹窗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的方式。须要注意的是方法的命名要有点讲究,不能太随意,不然一个项目里面有几十个弹窗样式的时候也会变成一个灾难。