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

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方法:

  1. 保存当前Dialog的引用,方便后续更新UI;
  2. 打开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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:49:05