如何在 do while 循环中连续显示 AlertDialog 直到满足特定条件?

How do I continuously show an AlertDialog in a do while loop until a certain condition is met?

我有一个 AlertDialog,我想至少向用户显示一次,然后即使在用户单击“确定”后,也会继续向用户显示对话框,直到满足特定条件。

这是我目前为止的 AlertDialog 代码结构:

do {
    val dialogShow: AlertDialog.Builder = AlertDialog.Builder(this@MainActivity)
    dialogShow.setCancelable(false)

    dialogShow.setMessage("Message")
        .setPositiveButton(
            "ok",
            object : DialogInterface.OnClickListener {
                override fun onClick(dialogInterface: DialogInterface, i: Int) {
                    if (checkCondition()) {
                        conditionMet = true
                    } else {
                        // Keep looping
                    }
                }
            })
        .setNegativeButton(
            "cancel",
            object : DialogInterface.OnClickListener {
                override fun onClick(dialogInterface: DialogInterface, i: Int) {
                    conditionMet = true
                    return
                }
            })

    dialogShow.show()
} while (conditionMet == false)

我现在面临的问题是 AlertDialog 会显示一次,但之后不会再显示。即使conditionMet = false也不会继续显示。如何在循环中继续显示相同的 AlertDialog

通过将显示代码包装在一个循环中,您可以连续显示它。如果对话框被关闭,您可能想做的是重新显示对话框。所以像这样的伪代码:

fun showObtrusiveDialog() {

    ...
    dialog.setPositiveButton {
    
        if(shouldStillBeObtrusive()) showObtrusiveDialog()
        ...
    }.setNegativeButton {

        ...
    }

    dialog.show()
}

处理此问题的另一种方法是禁用按钮,直到您准备好允许用户关闭对话框。这是您可以在条件发生变化时调用的扩展函数:

fun AlertDialog.setAllButtonsState(enabled: Boolean) {
    arrayOf(DialogInterface.BUTTON_POSITIVE, DialogInterface.BUTTON_NEGATIVE, DialogInterface.BUTTON_NEUTRAL)
        .forEach { getButton(it)?.setEnabled(enabled) }
}

所以你可以在显示之前调用它来禁用它们,并在你的情况发生变化时再次调用它。您需要将对话框保留在 属性 中,以便您可以从条件发生变化的任何地方访问它。