封装一个独立弹窗Module,这里的弹窗包括普通的Dialog方式弹框和WindowManager方式弹窗。提供一种管理项目里面弹窗的方案,便于后期修改和维护。

  首先描述一个在大项目中普遍存在的一个现象:由于项目的功能多,负责功能的人不同,当功能中需要一个普通的确定取消对话框时,大部分人都选择自己写了一个,自己new一个独立的弹窗出来。这样做的好处有以下几个:

  1. 代码逻辑独立,自己写的代码自己能控制
  2. 快速方便,便于修改,便于满足各种奇怪的需求

  可是这个做法导致项目中存在大量的代码冗余,大量的分散的弹窗,短期内一般也不会有什么问题,如果这个时候项目要重构,要修改所有弹窗的样式,接下来面临几个问题:

  1. 不知道有多少个弹窗
  2. 不知道代码中什么地方会有弹窗
  3. 不知道弹窗写法都有哪些(样式不知道,弹出的方式是Dialog还是WindowManager)
  4. 改动点多,工作量大,风险大

  本文就是针存在以上弹窗特点的项目,提供一种对话框的管理方式,提供一种比较好维护的实现方式(不一定是最好的实现方式)。由于代码量大,本文只讲实现设计思想和实现方式,具体源码可以直接从github下载查看,后面会提供地址。

本文实现弹窗效果动画演示

  本文中Dialog弹窗样式总共实现了12种,但是这个不能作为一个标准,要根据自己项目的实际情况,自己做分类,当然大部分简单的项目用本文提供的Module就可以直接使用。

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

常见弹窗的实现方式

常见弹窗的实现方式分析

  这种实现方式一般是项目刚开始的时候,写弹窗的人一般都会这样设计,本身没什么问题,如果弹窗样式少并且弹窗布局都比较规范还是可以维护的。但是实际上这两个条件在大项目中一般都不满足的,首先弹窗样式肯定不少,其实为了满足产品各种需求,弹窗布局也会不同。现象一下,就一个对话框弹窗布局里面要容纳所的弹窗样式,也就是一个CommonDialog包含了所有的弹窗逻辑,这本身就维护了单一性原则。而且越往后越难维护,所有人都改同一个类,同一个布局,第一次经手的人估计是有点难以下手修改的。为了解决这种现象,可以用下面的方式来代替。

易维护易拓展的对话框弹窗实现方式

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

Android重构与设计之路,从整理提示弹窗(SmartAlertPop)开始的更多相关文章

  1. 转:微信Android客户端架构演进之路

    转自: http://www.infoq.com/cn/articles/wechat-android-app-architecture 微信Android客户端架构演进之路 作者 赵原 发布于 20 ...

  2. 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发

    掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...

  3. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  4. 微信Android客户端架构演进之路

    这是一个典型的Android应用在从小到大的成长过程中的“踩坑”与“填坑”的历史.互联网的变化速度如此之快,1年的时间里,可以发生翻天覆地的变化.今天在这里,重新和大家回顾微信客户端架构的演进过程,以 ...

  5. CSS代码重构与优化之路(转)

    CSS代码重构与优化之路   阅读目录 CSS代码重构的目的 CSS代码重构的基本方法 CSS方法论 我自己总结的方法 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多 ...

  6. 网易考拉Android客户端网络模块设计

    本文来自网易云社区 作者:王鲁才 客户端开发中不可避免的需要接触到访问网络的需求,如何把访问网络模块设计的更具有扩展性是每一个移动开发者不得不面对的事情.现在有很多主流的网络请求处理框架,如Squar ...

  7. Android App的设计架构:MVC,MVP,MVVM与架构AAAAA

    1. 架构设计的目的1.1 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.1.2 这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续 ...

  8. 【转】Android的材料设计兼容库(Design Support Library)

    转自:http://www.jcodecraeer.com/a/anzhuokaifa/developer/2015/0531/2958.html?mType=Group Android的材料设计兼容 ...

  9. Android的界面设计工具 DroidDraw

    Android的界面设计工具 DroidDraw DroidDraw 下载地址:http://code.google.com/p/droiddraw/ 如图 也可以使用在线的版本(http://www ...

随机推荐

  1. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  2. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  3. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  4. Ubuntu 16.10 安装byzanz截取动态效果图工具

    1.了解byzanz截取动态效果图工具 byzanz能制作文件小,清晰的GIF动态效果图,不足就是,目前只能通过输入命令方式来录制. byzanz主要的参数选项有: -d, --duration=SE ...

  5. System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。

    在NHibernate数据库查询中出现了这个错误,由于是数据库是mysql的,当定义的字段为char(36)的时候就会出现这个错误. [解决方法] 将char(36) 改成varchar(40)就行了 ...

  6. javascript数组查重方法总结

    文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...

  7. PHP之购物车的代码

    该文章记录了购物车的实现代码,仅供参考 book_sc_fns.php <?php include_once('output_fns.php'); include_once('book_fns. ...

  8. css3线条围绕跑马+jquery打字机效果

    原文地址:css3线条围绕跑马+jquery打字机效果 有图有真相,今天偶然看到了一种效果,仔细看了下,发现它是用css的clip+css3的动画实现的,简直叼.于是自己拿来了前一阵子写的打字机效果, ...

  9. 【干货分享】流程DEMO-合同会审表

    流程名: 合同会审表  业务描述: 合同的审批及签订  流程相关文件: 流程包.xml 事务呈批表业务服务.xml 事务呈批表主数据.xml  流程说明: 1.此流程必须先进行事务呈批表流程的配置才可 ...

  10. Android中点击事件的实现方式

    在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事.今天我们就汇总一下点击事件的实现方式. 点击事件的实现大致分为 ...