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
相关产品推荐
相关产品推荐

