Android连续弹出两个MaterialDialog,最后一个无法用dismiss关闭求助
问题排查与解决
核心原因
你在两个弹窗的扩展函数中犯了同一个错误:
- 调用
build()创建了一个 Dialog 实例,并为这个实例的按钮设置了点击监听 - 随后调用 Builder 的
show()方法,这会重新创建一个全新的 Dialog 实例并显示 - 最终可见的弹窗是第二次创建的实例,而点击监听绑定在第一次创建的未显示实例上,导致调用
dismiss()时无法作用于当前可见的弹窗
修复后的代码
修改两个扩展函数,确保只创建一次 Dialog 实例并完成所有配置后再显示:
fun MaterialDialog.Builder.alertChangedIcon(action: () -> Unit) { this.apply { customView(R.layout.change_icon_dialog, false) canceledOnTouchOutside(false) }.build().apply { val btnPosition = findViewById(R.id.yesBtnView) as Button btnPosition.setOnClickListener { dismiss() action.invoke() } show() // 显示当前配置好的Dialog实例 } } fun MaterialDialog.Builder.alertIconInfoChanged(action: () -> Unit) { this.apply { customView(R.layout.title_subtitle_two_buttons_dialog_prime, false) canceledOnTouchOutside(false) }.build().apply { val title = findViewById(R.id.alertTitleView) as TextView val subtitle = findViewById(R.id.alertSubtitleView) as TextView val positiveButton = findViewById(R.id.yesBtnView) as Button val negativeButton = findViewById(R.id.noBtnView) as Button title.text = context.getString(R.string.happy_birthday) subtitle.text = context.getString(R.string.message_change_icon) negativeButton.apply { text = context.getString(R.string.ok) setOnClickListener { dismiss() action.invoke() } } // 隐藏确认按钮(若你的gone()不是扩展函数,替换为positiveButton.visibility = View.GONE) positiveButton.gone(true) show() // 显示当前配置好的Dialog实例 } }
额外说明
- 原代码中
positiveButton.gone(false)可能是笔误,若你想隐藏该按钮应传入true - View 层的调用代码无需修改,保持原有逻辑即可
内容的提问来源于stack exchange,提问作者Gabi
相关产品推荐
相关产品推荐

