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

Kotlin中如何延迟Toast至按钮按下或按按钮关闭Toast

解决方案:自定义Toast的显示时机与关闭逻辑

针对你需要的两个Toast功能,我们可以通过维护Toast实例和待显示消息的方式来实现,以下是具体实现方案:

一、按下按钮立即关闭当前Toast

Android原生Toast没有提供直接关闭的API,但可以通过保存Toast实例,在按钮点击时调用cancel()方法强制关闭。

实现代码

class MainActivity : AppCompatActivity() {
    // 保存当前活跃的Toast实例
    private var activeToast: Toast? = null

    fun onRollDice(view: View) {
        val diceOneValue = (1..6).random()
        val diceTwoValue = (1..6).random()

        if (diceOneValue != diceTwoValue) {
            // 关闭之前正在显示的Toast
            activeToast?.cancel()

            val toastMessage = """You rolled $diceTwoValue & $diceOneValue,
                Count ${diceTwoValue + diceOneValue}!
            """.trimIndent()

            // 创建并显示新的Toast,同时保存实例
            activeToast = Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT)
            activeToast?.show()
        }
    }
}

二、延迟Toast到下一次按钮按下时显示

通过维护一个待显示的消息变量,每次点击按钮时优先显示上一次保存的消息,再将当前消息存入变量等待下一次触发。

实现代码

class MainActivity : AppCompatActivity() {
    private var activeToast: Toast? = null
    // 保存待显示的Toast消息
    private var pendingToastMsg: String? = null

    fun onRollDice(view: View) {
        val diceOneValue = (1..6).random()
        val diceTwoValue = (1..6).random()

        val toastMessage = """You rolled $diceTwoValue & $diceOneValue,
            Count ${diceTwoValue + diceOneValue}!
        """.trimIndent()

        // 先关闭当前Toast(可选,结合需求一)
        activeToast?.cancel()

        if (diceOneValue != diceTwoValue) {
            pendingToastMsg?.let { savedMsg ->
                // 显示上一次保存的消息
                activeToast = Toast.makeText(this, savedMsg, Toast.LENGTH_SHORT)
                activeToast?.show()
            }
            // 将当前消息存入待显示队列
            pendingToastMsg = toastMessage
        } else {
            // 骰子值相等时清空待显示消息(可根据业务调整)
            pendingToastMsg = null
        }
    }
}

逻辑说明

  • 第一次点击按钮时,仅保存消息不显示;第二次点击时,先显示第一次的消息,再保存第二次的消息;以此类推。
  • 如果需要同时支持"立即关闭"和"延迟显示",可以保留activeToast?.cancel()的逻辑,确保每次点击都会关闭之前的Toast。

内容的提问来源于stack exchange,提问作者Stephen Adegbite

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:30:44