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

使用TextWatcher监听EditText时总和计算异常问题排查求助

问题分析与修复方案

你的代码逻辑存在两个核心问题:

  1. 旧值保存时机错误:你用a存储的是上一次输入的最终值,并非当前修改前的旧值,导致删除或修改内容时,减去的数值完全不符合预期。
  2. 空输入场景未处理:当用户把输入内容删空时,没有从总和中减去之前的有效数值,导致总和残留错误值。

修复思路

正确的逻辑应该是:

  • 在beforeTextChanged中记录输入框修改前的旧数值
  • 在afterTextChanged中获取修改后的新数值
  • 通过「新值 - 旧值」计算差值,用总和加上这个差值,就能自动覆盖新增、修改、删除的所有场景

修正后的代码

var fifthUp = 0  

floor5_up.addTextChangedListener(object : TextWatcher {
    // 保存修改前的旧值
    private var oldValue = 0

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        // 记录当前输入的旧数值,空字符串则视为0
        oldValue = s?.toString()?.takeIf { it.isNotEmpty() }?.toIntOrNull() ?: 0
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        // 此处无需处理总和,统一交给afterTextChange计算
    }

    override fun afterTextChanged(s: Editable?) {
        // 获取修改后的新数值,空字符串则视为0
        val newValue = s?.toString()?.takeIf { it.isNotEmpty() }?.toIntOrNull() ?: 0
        
        // 计算差值并更新总和:总和 = 总和 + (新值 - 旧值)
        fifthUp += (newValue - oldValue)
        total5F_up.text = fifthUp.toString()
        
        // 执行你的其他业务逻辑
        findValue(floor5_up, 5, 2, 16, 0)
    }
})

关键说明

  • 用toIntOrNull()替代Integer.parseInt(),避免输入非数字字符时直接崩溃(如果需要限制输入为纯数字,建议给EditText设置inputType="number")
  • 空输入统一处理为0,不管是删除到空还是初始为空,都能正确计算差值
  • 所有总和更新逻辑集中在afterTextChanged,避免多次修改导致的状态混乱

内容的提问来源于stack exchange,提问作者Rey Mark Enriquez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:32:54