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

Kotlin继承父类打开的Dialog调用dismiss()方法无法关闭如何解决?

问题根因

controlProgressDialog方法每次调用都会创建全新的Dialog实例:

  • 传入true时新建Dialog实例A并展示
  • 后续传入false时新建完全无关的Dialog实例B,对B执行dismiss操作,始终没有处理已经展示的实例A,因此弹窗无法关闭。

修复方案

修改BaseFunctions.kt代码,将进度Dialog改为类成员变量,所有操作复用同一个实例即可:

open class BaseFunctions : AppCompatActivity() {
    // 新增全局Dialog成员变量,复用同一个实例
    private var progressDialog: Dialog? = null

    // 仅修改controlProgressDialog方法逻辑,其余原有方法不变
    fun controlProgressDialog(showDialog : Boolean){
        if (showDialog) {
            // 仅当实例不存在时才新建,避免重复创建
            if (progressDialog == null) {
                progressDialog = Dialog(this).apply {
                    setCancelable(false)
                    setCanceledOnTouchOutside(false)
                    setContentView(R.layout.progress_dialog)
                }
            }
            // 避免重复调用show抛出异常
            progressDialog?.takeIf { !it.isShowing }?.show()
        } else {
            // 隐藏时直接操作已有的实例,销毁后置空避免内存泄漏
            progressDialog?.let {
                if (it.isShowing) {
                    it.dismiss()
                }
                progressDialog = null
            }
        }
    }

    // 其余原有方法(removeToolStatusBar、controlSnackBar)保持不变即可
}

可选优化

可以在BaseFunctions中增加onDestroy生命周期回调,页面销毁时主动释放Dialog资源,避免内存泄漏:

override fun onDestroy() {
    super.onDestroy()
    controlProgressDialog(false)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:18:02