Android重构与设计之路,从整理提示弹窗(SmartAlertPop)开始

  封装一个独立弹窗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的方式不好使用,可以采用社友imkarl提供的思路,使用多function的方式代替多type的方式。需要注意的是方法的命名要有点讲究,不能太随意,否则一个项目里面有几十个弹窗样式的时候也会变成一个灾难。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯NEXT学位

那些让编码效率起飞(前端)的工具了解一下

? | 导语 想晚上吃鸡?前端编码效率提升工具了解一下? 一、Bash篇(Mac) iTerm2 iTerm 2 is a terminal emulato...

973
来自专栏青枫的专栏

day49_BOS项目_01

其余步骤参考如下链接: https://www.cnblogs.com/chenmingjun/p/9513143.html#_label0 右键项目 -->...

622
来自专栏用户画像

测试用例参考示范

823
来自专栏大史住在大前端

webpack4.0各个击破(4)—— Javascript & splitChunk

javascript之所以需要打包合并,是因为模块化开发的存在。开发阶段我们需要将js文件分开写在很多零碎的文件中,方便调试和修改,但如果就这样上线,那首页的h...

713
来自专栏Fundebug

如何使用@vue/cli 3.0在npm上创建,发布和使用你自己的Vue.js组件库

译者按: 你可能npm人家的包过成千上万次,但你是否有创建,发布和使用过自己的npm包?

2165
来自专栏FreeBuf

滥用Edge浏览器的“恶意站点警告”特性,实现地址栏欺骗

前言 在过去的几个月里,我们看到使用这种以技术支撑的骗术日益增多,用户的浏览器会被辣眼睛的红屏以及类似”你的电脑可能存在风险”的提示消息”锁定”。当然,这种情形...

1929
来自专栏FreeBuf

利用缓存服务形成的SSRF和其它客户端形式渗透

Edge Side Includes (ESI)标记语言主要用于各种流行的HTTP代理中(如反向代理、负载均衡、缓存服务器、代理服务器)解决网页缓存问题。早前我...

592
来自专栏進无尽的文章

推送-JPush(极光推送)的使用

推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,...

881
来自专栏葡萄城控件技术团队

ASP.NET MVC 5 - 给电影表和模型添加新字段

在本节中,您将使用Entity Framework Code First来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。 默认情况下,就像您在...

1948
来自专栏小狼的世界

Vimperator的有用操作

可以有一个变通的办法复制,先按下"Ctrl+V",然后再用快捷键复制,接下来Vim的快捷键又起作用了。现在还有一个困惑的地方是不用鼠标,如何选中网页中自己希望的...

693

扫码关注云+社区