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

EditText输入/删除字符后光标跳至开头,需保持光标原位

解决EditText设置文本后光标跳至开头的问题

问题根源是每次调用setText()时,EditText会默认将光标重置到文本起始位置。只需在设置完文本后,手动把光标移到文本末尾即可解决。

修改后的SeekBar监听代码:

binding.includeFirstSeekbar.seekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
    override fun onProgressChanged(seekBar: SeekBar, progress: Int, b: Boolean) {
        val number = progress.toDouble() / 100
        val dec = DecimalFormat("#,##0.00")
        val credits = dec.format(number)
        binding.seekbarValue.setText(credits)
        // 将光标定位到文本末尾
        binding.seekbarValue.setSelection(binding.seekbarValue.text.length)
    }

    // 必须实现另外两个抽象方法,否则编译报错
    override fun onStartTrackingTouch(seekBar: SeekBar) {}
    override fun onStopTrackingTouch(seekBar: SeekBar) {}
})

如果用户手动修改EditText内容时也出现光标跳位,说明存在SeekBar和EditText双向联动的循环触发问题。可以通过在EditText输入时暂时移除SeekBar监听、输入完成后恢复的方式解决,同时保持光标位置:

// 抽离SeekBar监听器,方便复用和移除
private val seekBarChangeListener = object : OnSeekBarChangeListener {
    override fun onProgressChanged(seekBar: SeekBar, progress: Int, b: Boolean) {
        val number = progress.toDouble() / 100
        val dec = DecimalFormat("#,##0.00")
        val credits = dec.format(number)
        binding.seekbarValue.setText(credits)
        binding.seekbarValue.setSelection(binding.seekbarValue.text.length)
    }

    override fun onStartTrackingTouch(seekBar: SeekBar) {}
    override fun onStopTrackingTouch(seekBar: SeekBar) {}
}

// 给EditText添加文本变化监听
binding.seekbarValue.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        // 暂时移除SeekBar监听,避免循环触发
        binding.includeFirstSeekbar.seekBar.setOnSeekBarChangeListener(null)
        
        // 根据EditText内容更新SeekBar进度(双向绑定逻辑)
        s?.let {
            try {
                val cleanValue = it.toString().replace(",", "")
                val value = cleanValue.toDouble()
                val progress = (value * 100).toInt()
                binding.includeFirstSeekbar.seekBar.progress = progress
            } catch (e: NumberFormatException) {
                // 处理用户输入非法字符的情况
            }
        }
        
        // 保持光标在当前输入位置末尾
        binding.seekbarValue.setSelection(s?.length ?: 0)
    }

    override fun afterTextChanged(s: Editable?) {
        // 恢复SeekBar监听
        binding.includeFirstSeekbar.seekBar.setOnSeekBarChangeListener(seekBarChangeListener)
    }
})

// 初始化时设置SeekBar监听
binding.includeFirstSeekbar.seekBar.setOnSeekBarChangeListener(seekBarChangeListener)

内容的提问来源于stack exchange,提问作者ivan14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:03:21