DialogUitls对Dialog进行封装

1
2
3
4
5
开发中难免会遇到很多各种奇怪的需求及 各式各样的dialog.写一些无畏的代码.
我们除了粘贴复制好像也没有其他技术可言,目前常用的dialog也就无非那些步骤,
在此基础上我决定痛定思痛,呈现在不是特别忙写一下.
首先我们要有思路

思路

原生 Dialog 的使用及不足
先贴出一般的使用方法:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("title")
    .setMessage("message")
    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int id) {

      }
    })
    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int id) {

      }
    });
builder.create().show();

可以发现如果在项目中多次使用此种方法构建 Dialog 那么势必会产生大量重复的无用代码。且项目中如果需要多次展现相同的 Dialog ,这时每个 Dialog 都产生一个对象显然是极为浪费资源。再加上这个对象被回收还会带来的 ANR 风险。所以,我们需要对 Dialog 进行封装。

封装 Dialog 工具类的思路

即有如下需求:
  • 丰富的自定义选项
  • 尽量减小内存占用

其中第二点可以通过 Dialog 与页面的解耦来实现,具体的方式是建立一个单例模式的 DialogUtil ,用这个工具类来持有 Dialog 对象的弱引用,并提供展示、隐藏 Dialog 的方法给页面调用

这样做的好处是:
  • 可以实现 Dialog 的复用
  • 弱引用可以防止内存泄漏
  • 统一管理 Dialog ,对象被回收时即使重建以避免 ANR
    1
    2
    自定义 - 传参
    减小内存 - 较少对象,单例实现,抛弃枚举使用注解

同时需要给用户暴露相应的可能用到的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
需要提供的接口:
创建
销毁
事件监听
样式及内容设置
创建:
可采取模仿AlertDialog的形式,通过build创建.
优点: 可以根据自己的需求设置,代码简洁.不至于通过创建对象传参的形式繁琐.
样式设置:
可通过传入的枚举Type设置展示的Dialog的样式,比如:Toast;提示(只有确认);提示(确认,取消都有);提示(有没有标题)等等
甚至可以设置style样式比如,背景色及按钮样式等
事件监听:
普通提示类的dialog 只需要设置确认\取消的监听即可;
但是对于复杂dialog 还需设置item的监听.
> 复杂dialog主要是列表dialog
> 不带rediobutton单选list
> 带rediobutton单选list
> 带复选框的list dialog
> 复杂Dialog其他特殊情况
> 图片查看,区别切换样式动画
> 卡片引导下一页,下一页
> 登录带输入样式
> loging 转圈动画