Android中如何在当前Dialog类中感知另一个Dialog已关闭
实现外部Dialog关闭监听并更新当前Dialog的方案
没问题,我来帮你搞定这个需求——当外部的ProviderDialog关闭时,让当前的Dialog感知到并获取共享数据更新UI。下面是具体的实现步骤:
第一步:给ProviderDialog添加关闭监听支持
首先,你需要在ProviderDialog类中添加设置关闭监听的方法,让外部可以监听它的关闭事件。假设你的ProviderDialog类里已经有创建AlertDialog的逻辑,我们给它加上监听支持:
方案1:复用系统OnDismissListener
public class ProviderDialog { private AlertDialog mDialog; // 原有显示Dialog的方法 public void showProvidersDialog(int categoryId) { // 这里是你原来创建AlertDialog.Builder并设置内容的代码 // ... // 创建并显示Dialog,同时保存引用 mDialog = alertDialogBuilder.show(); } // 添加方法:让外部设置Dialog关闭监听 public void setOnDialogDismissListener(DialogInterface.OnDismissListener listener) { if (mDialog != null) { mDialog.setOnDismissListener(listener); } } }
方案2:自定义回调接口(语义更清晰)
// 自定义回调接口,专门用于通知ProviderDialog关闭事件 public interface OnProviderDialogClosedCallback { void onProviderDialogClosed(); } public class ProviderDialog { private AlertDialog mDialog; private OnProviderDialogClosedCallback mCallback; // 设置自定义回调的方法 public void setOnProviderDialogClosedCallback(OnProviderDialogClosedCallback callback) { this.mCallback = callback; } public void showProvidersDialog(int categoryId) { // 原有创建Dialog的代码 // ... mDialog = alertDialogBuilder.show(); // 给Dialog设置默认的关闭监听,触发自定义回调 mDialog.setOnDismissListener(dialog -> { if (mCallback != null) { mCallback.onProviderDialogClosed(); } }); } }
第二步:在当前Dialog类中监听关闭事件并更新UI
接下来,你需要修改当前类的showCategoryInformationDialog方法:
- 保存当前Dialog的引用,方便后续更新UI;
- 打开
ProviderDialog时设置关闭监听,在回调中获取共享数据并更新控件。
修改后的完整代码
// 新增成员变量:保存当前的信息Dialog引用 private AlertDialog mCategoryInfoDialog; private void showCategoryInformationDialog() { LayoutInflater li = LayoutInflater.from(context); informationPromptsView = li.inflate(R.layout.row_category_information_layout, null); android.app.AlertDialog.Builder alertDialogBuilder = new android.app.AlertDialog.Builder(context, R.style.dialogBoxStyle); alertDialogBuilder.setView(informationPromptsView); inputBillProvider = informationPromptsView.findViewById(R.id.inputBillProvider); inputConsumerNumber = informationPromptsView.findViewById(R.id.inputConsumerNumber); name = informationPromptsView.findViewById(R.id.name); inputBillProvider.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 打开外部ProviderDialog providerDialog.showProvidersDialog(customCategory.getCustCategoryId()); // 方式一:使用系统OnDismissListener providerDialog.setOnDialogDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { // 通过单例获取用户填写的共享信息 YourSingletonDataHolder dataHolder = YourSingletonDataHolder.getInstance(); String providerName = dataHolder.getProviderName(); String consumerNum = dataHolder.getConsumerNumber(); // 更新当前Dialog的UI(先判断Dialog是否还在显示) if (mCategoryInfoDialog != null && mCategoryInfoDialog.isShowing()) { inputBillProvider.setText(providerName); inputConsumerNumber.setText(consumerNum); } } }); // 方式二:使用自定义回调(如果用了上面的自定义接口) /* providerDialog.setOnProviderDialogClosedCallback(() -> { YourSingletonDataHolder dataHolder = YourSingletonDataHolder.getInstance(); if (mCategoryInfoDialog != null && mCategoryInfoDialog.isShowing()) { inputBillProvider.setText(dataHolder.getProviderName()); inputConsumerNumber.setText(dataHolder.getConsumerNumber()); } }); */ } }); alertDialogBuilder.setPositiveButton(context.getString(R.string.add), (dialog, which) -> dialog.dismiss()); alertDialogBuilder.setNegativeButton(context.getString(R.string.cancel), (dialog, which) -> dialog.dismiss()); // 保存当前Dialog的引用 mCategoryInfoDialog = alertDialogBuilder.show(); }
关键注意事项
- 确保你的单例数据类(
YourSingletonDataHolder)在ProviderDialog关闭前,已经正确保存了用户填写的信息; - 更新UI前一定要判断当前Dialog是否还处于显示状态,避免空指针异常;
- 如果
ProviderDialog是复用的,记得每次设置监听前可以先移除旧的监听,防止重复回调。
内容的提问来源于stack exchange,提问作者Anisha Singh
相关产品推荐
相关产品推荐

