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
相关产品推荐
相关产品推荐

