Android中EditText输入后添加后缀文本卡顿问题的解决方法
解决EditText自动添加后缀导致的卡顿问题
你的代码出现卡顿的核心原因是无限循环触发TextWatcher回调:每次调用setText()都会触发EditText的文本变化,进而再次调用afterTextChanged(),反复执行导致UI线程被阻塞,出现卡顿。
下面是两种可行的解决方案:
方案一:使用标记位避免循环
通过布尔标记位判断当前文本更新是否是我们主动触发的,跳过回调处理,避免循环:
private var isUpdatingText = false loginPage4SelectTxt.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} override fun afterTextChanged(p0: Editable?) { if (isUpdatingText) return val input = p0?.toString()?.trim() ?: "" // 先移除已存在的后缀,防止重复添加 val cleanInput = input.removeSuffix(" Kg") isUpdatingText = true loginPage4SelectTxt.setText("$cleanInput Kg") // 将光标定位到用户输入内容的末尾,方便继续输入 loginPage4SelectTxt.setSelection(cleanInput.length) isUpdatingText = false } })
方案二:临时移除TextWatcher再重新添加
修改文本前先移除监听,避免触发回调,修改完成后重新添加监听:
val textWatcher = object : TextWatcher { override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} override fun afterTextChanged(p0: Editable?) { val input = p0?.toString()?.trim() ?: "" val cleanInput = input.removeSuffix(" Kg") // 临时移除监听 loginPage4SelectTxt.removeTextChangedListener(this) loginPage4SelectTxt.setText("$cleanInput Kg") loginPage4SelectTxt.setSelection(cleanInput.length) // 重新添加监听 loginPage4SelectTxt.addTextChangedListener(this) } } loginPage4SelectTxt.addTextChangedListener(textWatcher)
额外优化点
- 处理空输入:如果用户清空内容,后缀也会被移除,避免显示
Kg这种无效文本 - 光标定位:设置光标到输入内容末尾,让用户可以连续输入,不用手动调整光标位置
内容的提问来源于stack exchange,提问作者Dr.KeyOk
相关产品推荐
相关产品推荐

