繁体   English   中英

带有货币格式的 addTextChangedListener 上的 EditText cursor position

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM