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

