Dialog 工具类封装(一):设计思路

本文探讨了原生Dialog的不足,如代码重复和资源浪费,并提出通过封装Dialog工具类来解决这些问题。封装思路包括创建单例模式的DialogUtil,使用弱引用持有Dialog对象,以实现内存优化和防止ANR。文中展示了如何用DialogType标记不同类型的Dialog,通过注解实现,并给出了showNormalDialog方法的参数表和使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原生 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


完成封装的示例 (showNormalDialog)

用 DialogType 来标记 Dialog

将你所使用的所有 Dialog 分别用常量(DialogType)标记,以便于区分不同的 Dialog。因为 Android 推荐使用注解替代枚举,所以这里用注解实现

添加示例:
@IntDef({CAR_CANCEL}) //在@IntDef注解中添加你的Dialog类型
@Retention(RetentionPolicy.SOURCE)
public @interface DialogType {
   // 取消叫车
   int CAR_CANCEL = 0; //定义你的Dialog类型,并写明注释
}


showNormalDialog 方法参数表

类型传值
Context当前Context
@DialogType intDialogType中定义的类型
intDialog标题的文字资源
intDialog右边按钮文字资源
intDialog左边按钮文字资源
CommonCallbackWithCancel两个按钮的回调接口


使用示例

DialogUtil.INSTANCE.showNormalDialog(
        DialogType.CAR_CANCEL,
        R.string.are_you_cancel_call,
        R.string.action_confirm, 
        R.string.cancel,
        new DialogUtil.CommonCallbackWithCancel() {
          @Override public void onPositive() {
             callCarCancel();
          }

          @Override public void onNegative() {

          }
        });
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值