You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Java设计模式问题:优化AlertDialog重复代码

优化AlertDialog的重复代码:基于OOP的解耦方案

你的问题核心是Dialog创建逻辑与业务逻辑硬耦合,导致每次需要不同点击事件时都要复制整段Dialog代码。用「自定义Dialog类+回调接口」的OOP方案可以完美解决,既复用通用配置,又能灵活注入不同的业务逻辑。

第一步:定义按钮点击回调接口

先把按钮点击的行为抽象成接口,让外部业务逻辑实现这个接口,从而解耦Dialog和具体操作:

public interface DialogButtonCallback {
    // 确认按钮(对应原代码的reset)点击回调
    void onPositiveButtonClicked(Dialog dialog);
    // 取消/次要按钮(对应原代码的scan)点击回调
    void onNegativeButtonClicked(Dialog dialog);
}

第二步:封装自定义通用AlertDialog类

把Dialog的通用创建逻辑(标题、消息、按钮设置、不可取消等)封装到一个工具类里,只把可变部分(标题、消息、按钮文本、回调)作为参数传入:

public class CommonAlertDialog {

    // 静态方法,直接调用创建Dialog
    public static void show(Context context, String title, String msg,
                           String positiveBtnText, String negativeBtnText,
                           DialogButtonCallback callback) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title)
               .setMessage(msg)
               .setCancelable(false)
               .setPositiveButton(positiveBtnText, (dialog, id) -> {
                   // 回调外部业务逻辑
                   if (callback != null) {
                       callback.onPositiveButtonClicked(dialog);
                   }
               })
               .setNegativeButton(negativeBtnText, (dialog, id) -> {
                   // 回调外部业务逻辑
                   if (callback != null) {
                       callback.onNegativeButtonClicked(dialog);
                   }
               });
        builder.show();
    }
}

第三步:在业务代码中调用

现在不管需要什么点击逻辑,都不用重复写Dialog创建代码,只需要实现回调接口即可,比如你原来的场景:

// 调用示例:原reset/scan逻辑
CommonAlertDialog.show(getActivity(), "提示", "请选择操作",
        "reset", "scan", new DialogButtonCallback() {
            @Override
            public void onPositiveButtonClicked(Dialog dialog) {
                dialog.cancel();
                txt_PlateNumber.setEnabled(true);
                txt_Quantity.setEnabled(true);
                btn_bring.setEnabled(true);
            }

            @Override
            public void onNegativeButtonClicked(Dialog dialog) {
                dialog.cancel();
                txt_PlateNumber.setEnabled(false);
                txt_Quantity.setEnabled(false);
                btn_bring.setEnabled(false);
                UnLockCamera();
            }
        });

// 新增场景:比如另一个确认/取消逻辑,直接复用CommonAlertDialog
CommonAlertDialog.show(getActivity(), "确认删除", "确定要删除这条数据吗?",
        "确认", "取消", new DialogButtonCallback() {
            @Override
            public void onPositiveButtonClicked(Dialog dialog) {
                dialog.cancel();
                // 执行删除操作
                deleteData();
            }

            @Override
            public void onNegativeButtonClicked(Dialog dialog) {
                dialog.cancel();
                // 取消操作
            }
        });

额外优化:用Lambda简化代码(Java 8+)

如果你的项目支持Java 8,可以用Lambda表达式简化回调写法,让代码更简洁:

// 先把回调接口改为函数式接口(添加@FunctionalInterface注解)
@FunctionalInterface
public interface PositiveCallback {
    void onClick(Dialog dialog);
}

@FunctionalInterface
public interface NegativeCallback {
    void onClick(Dialog dialog);
}

// 修改CommonAlertDialog的show方法
public static void show(Context context, String title, String msg,
                       String positiveBtnText, PositiveCallback positiveCallback,
                       String negativeBtnText, NegativeCallback negativeCallback) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle(title)
           .setMessage(msg)
           .setCancelable(false)
           .setPositiveButton(positiveBtnText, (dialog, id) -> {
               if (positiveCallback != null) {
                   positiveCallback.onClick(dialog);
               }
           })
           .setNegativeButton(negativeBtnText, (dialog, id) -> {
               if (negativeCallback != null) {
                   negativeCallback.onClick(dialog);
               }
           });
    builder.show();
}

// 调用时的Lambda写法
CommonAlertDialog.show(getActivity(), "提示", "请选择操作",
        "reset", dialog -> {
            dialog.cancel();
            txt_PlateNumber.setEnabled(true);
            txt_Quantity.setEnabled(true);
            btn_bring.setEnabled(true);
        },
        "scan", dialog -> {
            dialog.cancel();
            txt_PlateNumber.setEnabled(false);
            txt_Quantity.setEnabled(false);
            btn_bring.setEnabled(false);
            UnLockCamera();
        });

这种方案的优势:

  • 完全复用Dialog的通用创建代码,避免重复
  • 业务逻辑与Dialog解耦,修改逻辑不用动Dialog封装代码
  • 扩展性强,新增按钮类型(比如中立按钮)只需修改接口和封装类一次

内容的提问来源于stack exchange,提问作者Xiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:05:09