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

页面切换时不显示Toast提示问题及自定义Toast扩展失效求助

问题原因

你写的cancelError()函数每次调用都会新建一个Toast实例,你取消的是这个新实例,而不是之前正在显示的那个,所以完全起不到作用。

解决方法

要解决这个问题,你需要把当前显示的Toast实例保存起来,取消的时候操作同一个实例就行。修改后的代码如下:

// 保存当前正在显示的错误Toast实例
private var currentErrorToast: Toast? = null

fun Context.showError(message: String) {
    // 先取消之前可能还在显示的Toast
    currentErrorToast?.cancel()
    
    val inflater = LayoutInflater.from(this)
    val layout = inflater.inflate(R.layout.custom_toast_layout, null)
    val text = layout.findViewById<TextView>(R.id.text)
    text.text = message
    
    currentErrorToast = Toast(this).apply {
        duration = Toast.LENGTH_LONG
        view = layout
        show()
    }
}

fun Context.cancelError() {
    currentErrorToast?.cancel()
    currentErrorToast = null // 清空引用,防止内存泄漏
}
使用注意

当用户修正输入并准备跳转页面时,一定要调用cancelError(),比如在跳转前的点击事件里:

// 示例:跳转页面前取消Toast
btnSubmit.setOnClickListener {
    if (输入错误) {
        showError("输入格式有误")
    } else {
        cancelError()
        startActivity(Intent(this, NewActivity::class.java))
    }
}

另外,为了保险起见,你可以在当前页面的onPause()或者onDestroy()方法里也调用cancelError(),确保页面切换后Toast不会继续显示:

override fun onPause() {
    super.onPause()
    cancelError()
}

内容的提问来源于stack exchange,提问作者Ömer Seyfettin Yavuzyiğit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:32:34