页面切换时不显示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
相关产品推荐
相关产品推荐

