[英]EditText cursor position on addTextChangedListener with currency format
更改 EditText 内容后,是否可以将 cursor 放在选定的 position 上? 我已经制作了这些代码:
binding.editText1.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) {}
override fun afterTextChanged(s: Editable?) {
val stringText = s.toString()
if (stringText != current) {
binding.editText1.removeTextChangedListener(this)
val localeid = Locale("in", "ID")
val format1 = NumberFormat.getInstance(localeid) as DecimalFormat
format1.applyPattern("#,###.##")
val doublecont : Double
val cont = binding.editText1.text.toString().trim()
doublecont = if (cont.isNotEmpty()) {
cont.replace("\\.","").replace(",","").replace(".","").toDouble()
} else {
0.0
}
binding.editText1.setText(format1.format(doublecont))
binding.editText1.setSelection(binding.editText1.text!!.length)
binding.editText1.addTextChangedListener(this)
} else {
binding.editText1.setText("0")
}
}
})
我仍然对setSelection()
感到困惑,我从上面的代码中得到的结果是cursor将 go 到 EditText 字符的末尾。 我想要的是当我将cursor移动到 position X 并在其上键入任何数字时, cursor将留在最新的数字/字符后面。 有什么想法吗?
您正在使用setSelection(binding.editText1.text.!.length)
将 cursor position 显式设置为EditText
的末尾。 请记住,这发生在_after_TextChanged回调中,因此新文本已经添加。
您需要使用其他方法之一来处理此问题,该方法会告诉您 position 发生更改的位置( start
),以及有多少字符正在替换现有的多少( count
表示不同的东西,具体取决于它是哪种方法)。 通过这种方式,您可以确定 cursor 需要放置的位置。
我不记得您是否可以在这些方法中执行setSelection
或者稍后将其覆盖,但您可以做的一件事是在TextWatcher
object 中设置一个临时值:
object : TextWatcher {
var selectionPosition: Int? = null
然后你可以在前面的回调中设置它,并在afterTextChanged
中使用它。 基本上找出cursor需要go的位置,然后再设置position。 完成后清除它 - 但如果你总是设置它,它不需要可以为空,因为它总是在afterTextChanged
触发之前设置为适当的值。
顺便说一句,暂时删除TextWatcher
的好技巧,我总是添加一个更新标志来忽略更改。 下次我一定要用那个!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.