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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:35:24