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

如何从调用类捕获自定义Dialog的关闭事件(支持Kotlin/Java)

实现自定义Dialog关闭事件的跨语言捕获

要让Kotlin和Java类都能捕获自定义Dialog的关闭事件,核心是给Dialog的展示方法添加回调参数,同时兼顾两种语言的调用习惯。以下是具体实现步骤:

1. 定义统一的回调接口

先定义一个回调接口,确保Kotlin和Java都能实现:

interface OnDialogDismissListener {
    fun onDismiss()
}

2. 修改Dialog展示方法,添加回调参数

更新DialogShow的showDialog方法,接收回调参数,并在Dialog关闭时触发:

class DialogShow {
    companion object {
        // 基础版本:兼容Kotlin和Java的接口回调
        fun showDialog(
            account: Any, // 替换为你的实际数据类型
            context: Context,
            activity: FragmentActivity,
            listener: OnDialogDismissListener? = null
        ) {
            val customDialog = CustomDialog(account, context)
            // 绑定Dialog的关闭事件到传入的回调
            customDialog.onDismissListener = {
                listener?.onDismiss()
            }
            customDialog.show(activity, "rawer")
        }

        // Kotlin专属重载:支持Lambda写法,更简洁
        fun showDialog(
            account: Any,
            context: Context,
            activity: FragmentActivity,
            onDismiss: () -> Unit
        ) {
            showDialog(account, context, activity, object : OnDialogDismissListener {
                override fun onDismiss() = onDismiss.invoke()
            })
        }
    }
}

// 确保CustomDialog正确绑定关闭事件(如果尚未实现)
class CustomDialog(private val account: Any, context: Context) : Dialog(context) {
    var onDismissListener: (() -> Unit)? = null

    init {
        // 初始化Dialog布局等逻辑...
        // 系统Dialog的关闭监听,触发自定义回调
        setOnDismissListener {
            onDismissListener?.invoke()
        }
    }
}

3. Kotlin类中捕获关闭事件

在Kotlin调用类中,既可以用接口实现,也可以用更简洁的Lambda:

class CallDialog {
    fun showCustomDialog(account: Any, context: Context, activity: FragmentActivity) {
        // 方式1:接口实现(兼容习惯Java写法的场景)
        DialogShow.showDialog(account, context, activity, object : OnDialogDismissListener {
            override fun onDismiss() {
                // 处理Dialog关闭后的逻辑
                println("Kotlin:Dialog已关闭")
            }
        })

        // 方式2:Lambda写法(Kotlin推荐)
        DialogShow.showDialog(account, context, activity) {
            println("Kotlin Lambda:Dialog已关闭")
        }
    }
}

4. Java类中捕获关闭事件

Java类直接实现回调接口即可:

public class JavaCallDialog {
    public void showCustomDialog(Object account, Context context, FragmentActivity activity) {
        DialogShow.Companion.showDialog(account, context, activity, new OnDialogDismissListener() {
            @Override
            public void onDismiss() {
                // 处理Dialog关闭后的逻辑
                System.out.println("Java:Dialog已关闭");
            }
        });
    }
}

关键说明

  • 用接口作为回调载体,保证了Kotlin和Java的兼容性;
  • Kotlin的重载方法提供了更简洁的Lambda调用方式,不影响Java的使用;
  • 确保CustomDialog中正确绑定了系统的OnDismissListener,才能在Dialog关闭时触发我们的自定义回调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:40:26