Android重构与设计之路,从整理提示对话框弹窗开始

CharleyJarn 9年前
   <p>封装一个独立弹窗Module,这里的弹窗包括普通的Dialog方式弹框和WindowManager方式弹窗。提供一种管理项目里面弹窗的方案,便于后期修改和维护。</p>    <p>首先描述一个在大项目中普遍存在的一个现象:由于项目的功能多,负责功能的人不同,当功能中需要一个普通的确定取消对话框时,大部分人都选择自己写了一个,自己new一个独立的弹窗出来。这样做的好处有以下几个:</p>    <ol>     <li> <p>代码逻辑独立,自己写的代码自己能控制</p> </li>     <li> <p>快速方便,便于修改,便于满足各种奇怪的需求</p> </li>    </ol>    <p>可是这个做法导致项目中存在大量的代码冗余,大量的分散的弹窗,短期内一般也不会有什么问题,如果这个时候项目要重构,要修改所有弹窗的样式,接下来面临几个问题:</p>    <ol>     <li> <p>不知道有多少个弹窗</p> </li>     <li> <p>不知道代码中什么地方会有弹窗</p> </li>     <li> <p>不知道弹窗写法都有哪些(样式不知道,弹出的方式是Dialog还是WindowManager)</p> </li>     <li> <p>改动点多,工作量大,风险大</p> </li>    </ol>    <p>本文就是针存在以上弹窗特点的项目,提供一种对话框的管理方式,提供一种比较好维护的实现方式(不一定是最好的实现方式)。由于代码量大,本文只讲实现设计思想和实现方式,具体源码可以直接从github下载查看,后面会提供地址。</p>    <p><strong>本文实现弹窗效果动画演示</strong></p>    <p>本文中Dialog弹窗样式总共实现了12种,但是这个不能作为一个标准,要根据自己项目的实际情况,自己做分类,当然大部分简单的项目用本文提供的Module就可以直接使用。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2de73894f16db9f8d5d04ef3063cf3be.gif"></p>    <p><strong>常见弹窗的实现方式</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/192b06a2f5c489919a7443af2fecca83.png"></p>    <p><strong>常见弹窗的实现方式分析</strong></p>    <p>这种实现方式一般是项目刚开始的时候,写弹窗的人一般都会这样设计,本身没什么问题,如果弹窗样式少并且弹窗布局都比较规范还是可以维护的。但是实际上这两个条件在大项目中一般都不满足的,首先弹窗样式肯定不少,其实为了满足产品各种需求,弹窗布局也会不同。现象一下,就一个对话框弹窗布局里面要容纳所的弹窗样式,也就是一个CommonDialog包含了所有的弹窗逻辑,这本身就维护了单一性原则。而且越往后越难维护,所有人都改同一个类,同一个布局,第一次经手的人估计是有点难以下手修改的。为了解决这种现象,可以用下面的方式来代替。</p>    <p><strong>易维护易拓展的对话框弹窗实现方式</strong></p>    <p>WindowManager方式弹窗的设计思想与Dialog弹窗方式一样的,只是底层用来显示View的地方不一样,本文不具体讲,源码部分是包含的。</p>    <p><img src="https://simg.open-open.com/show/85f6093a8426230f9f594bf86e9588d4.png"></p>    <p><strong>易维护易拓展的对话框弹窗实现方式分析</strong></p>    <p>对于上面的实现方式有如下几个好处</p>    <p>1. 通过工厂模式,外部传入一个Type参数,使用者不需要关系实现细节,只需要知道Type对应的布局样式</p>    <p>2. 每种Type对应一种弹窗布局,只需要实现自己关系的接口</p>    <p>3. 各种弹窗逻辑完全独立,独立修改,独立维护</p>    <p>使用者需要关注Type类型和需要调用对应Type弹窗的什么方法,这里的Type类型必须要让使用者知道它对应什么样的样式,这个比较难,代码里面只能通过注释的方式来说明了,如果比较正统化的公司可能会有文档记录。不过这里也不会造成多大的困扰,使用者随很容易就测试出是不是自己要的样式,所以使用者还是能很方便的进行使用的。</p>    <p><strong>易维护易拓展的部分对话框弹窗展示</strong></p>    <p><strong>弹窗效果实现了各种不同造型的圆角,以及按钮支持了水波纹</strong></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f676f602935fc5331c803eedd7fbf1e2.png"> <img src="https://simg.open-open.com/show/f772c4b7af9310b6af2a34170afeec03.png"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f78627f343720a539216d051764ebe81.png"> <img src="https://simg.open-open.com/show/8a0729625ab64719ab0756432d0b50af.png"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/168b72ecafb35783ea197f475d4b0bfd.png"> <img src="https://simg.open-open.com/show/1e925609e9428eceaa6a16c444c62011.png"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/0fc157a286024c11ab9381368965b97f.png"> <img src="https://simg.open-open.com/show/cd872abf61ceffd5434324c95e993572.png"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e6b70a935094625b51c5966c2d981e9f.png"> <img src="https://simg.open-open.com/show/d8f1f2847b621b64ebd160c686145fa4.png"></p>    <p>易维护易拓展的对话框弹窗源码实现</p>    <p>实现这种弹窗,需要定义好Type类型,要根据自己项目的实际情况对Type类型进行合理的分类</p>    <p>弹窗效果实现了各种不同造型的圆角,以及按钮支持了水波纹</p>    <h3><strong>总结</strong></h3>    <p>本项目只是提供一种基本的框架,具体的对话框样式可以根据自身项目的需求而改变,可以随意添加删除修改一种类型,主要是为了统一管理项目中的弹窗,方便维护与管理。</p>    <p> </p>    <p>来自:http://www.cnblogs.com/popfisher/p/6028613.html</p>    <p> </p>