Kotlin Android如何实现TextView显示数秒后隐藏,切换输入可重复触发?
解决方案
问题根因
- 首次alpha动画执行后如果设置了
fillAfter = true,会直接修改TextView的alpha属性为0,后续如果没有手动重置为1,再次触发动画时从0到0自然看不到效果 - 没有移除上一次的延迟隐藏任务,多次触发时旧任务会提前把TextView隐藏,导致逻辑看起来失效
实现步骤
1. 定义全局变量与生命周期绑定
在Fragment中添加隐藏任务的Runnable,同时在页面销毁时移除未执行的任务避免内存泄漏:
open class Begin1Fragment : Fragment(), View.OnClickListener { private lateinit var button: Button private lateinit var editText: EditText private lateinit var textView: TextView // 新增:隐藏TextView的任务 private val hideTextRunnable = Runnable { // 可自定义淡出动画时长,不需要动画的话直接设置visibility即可 textView.animate() .alpha(0f) .setDuration(300) .withEndAction { textView.visibility = View.GONE } .start() } // ... 原有onCreateView逻辑不变 override fun onDestroyView() { super.onDestroyView() // 移除未执行的隐藏任务,避免内存泄漏 textView.removeCallbacks(hideTextRunnable) } }
2. 封装自动显示隐藏方法(可选,简化代码)
private fun showTipText(content: String) { // 先移除上一次的隐藏任务,避免多次触发冲突 textView.removeCallbacks(hideTextRunnable) // 重置TextView状态为显示 textView.text = content textView.visibility = View.VISIBLE textView.alpha = 1f // 延迟3秒后执行隐藏 textView.postDelayed(hideTextRunnable, 3000) }
3. 替换原有逻辑
适配星期选择场景:
override fun onClick(v: View?) { if (editText.text.isNotEmpty()) { when (editText.text.toString().toInt()) { 1 -> showTipText("您手动选择的是:星期一") 2 -> showTipText("您手动选择的是:星期二") 3 -> showTipText("您手动选择的是:星期三") 4 -> showTipText("您手动选择的是:星期四") 5 -> showTipText("您手动选择的是:星期五") 6 -> showTipText("您手动选择的是:星期六") 7 -> showTipText("您手动选择的是:星期日") else -> showTipText("不存在该星期数") } } }
适配正方形周长计算场景:
override fun onClick(v: View?) { when { editText.text.isNotEmpty() -> { val a = editText.text.toString().toInt() if (a <= 0){ Toast.makeText(requireContext(), "正方形周长不能为负数或0", Toast.LENGTH_LONG).show() } else if (a > 0) { val p = 4 * a showTipText("正方形周长为:$p") } else { Toast.makeText(requireContext(), "错误", Toast.LENGTH_LONG).show() } } editText.text.isEmpty() -> { Toast.makeText(requireContext(), "请输入数据", Toast.LENGTH_LONG).show() } else -> { Toast.makeText(requireContext(), "错误!", Toast.LENGTH_LONG).show() } } }
可选调整
- 不需要淡出动画的话,直接把
hideTextRunnable里的动画逻辑删除,仅保留textView.visibility = View.GONE即可 - 3000毫秒的显示时长、300毫秒的动画时长都可以根据需求自行修改
内容的提问来源于stack exchange,提问作者cj3dreams
相关产品推荐
相关产品推荐

