Android测试页对话框顺序异常:错误提示与结束弹窗顺序颠倒
解决对话框顺序显示问题
问题根源是当前代码中,答错最后一题时会同时触发纠正对话框和结束对话框的显示——show()方法是异步执行的,不会等待用户关闭前一个对话框,导致两个对话框叠加,且Activity即将结束时纠正对话框被快速销毁,只短暂闪现。
要实现对话框按顺序显示,核心是让后续逻辑(显示结束对话框/进入下一题)等待用户关闭当前对话框后再执行,具体可以通过给对话框添加关闭监听来实现:
步骤1:给CorrectionDialogFragment添加关闭回调
修改你的CorrectionDialogFragment,增加关闭监听器接口,用于在对话框关闭时通知外部:
class CorrectionDialogFragment(private val guess: Int) : DialogFragment() { private var onDismissCallback: (() -> Unit)? = null // 设置关闭回调 fun setOnDismissCallback(callback: () -> Unit) { this.onDismissCallback = callback } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return AlertDialog.Builder(requireContext()) .setMessage("你的答案:$guess,正确答案:${/* 替换为你的正确答案变量 */}") .setPositiveButton("确定") { dialog, _ -> dialog.dismiss() } .create() } override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) // 对话框关闭时触发回调 onDismissCallback?.invoke() } }
步骤2:修改evaluateAnswer函数,按顺序执行逻辑
将后续逻辑(进入下一题/显示结束对话框)抽成独立函数,仅在用户关闭纠正对话框后(答错时)或直接(答对时)执行:
fun evaluateAnswer(guess: Int) { val isAnswerCorrect = guess == correct if (isAnswerCorrect) { correctAnswers++ } // 无论对错都执行的操作:必须将已答题数+1,否则无法触发测试结束逻辑 totalAnswers++ // 抽离后续逻辑,复用代码 fun proceedWithTest() { if (totalAnswers < testLength) { updateView(matchups[totalAnswers]) } else { val endDialog = EndTestDialogFragment(percentage) endDialog.show(supportFragmentManager, "end") // 用户关闭结束对话框后,结束当前Activity endDialog.setOnDismissListener { finish() } } } if (isAnswerCorrect) { // 答对直接执行后续逻辑 proceedWithTest() } else { // 答错先显示纠正对话框,关闭后再执行后续逻辑 val correctionDialog = CorrectionDialogFragment(guess) correctionDialog.setOnDismissCallback { proceedWithTest() } correctionDialog.show(supportFragmentManager, "correction") } }
补充:给EndTestDialogFragment添加关闭监听
如果需要用户关闭结束对话框后自动结束Activity,给EndTestDialogFragment添加类似的关闭回调:
class EndTestDialogFragment(private val percentage: Float) : DialogFragment() { private var onDismissCallback: (() -> Unit)? = null fun setOnDismissCallback(callback: () -> Unit) { this.onDismissCallback = callback } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return AlertDialog.Builder(requireContext()) .setMessage("测试结束!你的得分:${percentage}%") .setPositiveButton("确定") { dialog, _ -> dialog.dismiss() } .create() } override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) onDismissCallback?.invoke() } }
这样修改后,当用户答错最后一题时,只会先显示纠正对话框,等用户点击关闭后才会弹出结束对话框,完全按顺序执行,不会出现对话框闪现的问题。
内容的提问来源于stack exchange,提问作者geardan
相关产品推荐
相关产品推荐

