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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:06:25