有效地操纵或捕获EditText输入

时间:2019-12-07 14:33:59

标签: android android-edittext android-textwatcher

我要实现的目标

我想将用户输入的每个字符转换为另一个字符并显示在EditText中。

我做了什么

我的第一种方法是使用TextWatcher实现的。

     private val textWatcher2 = object : TextWatcher {
        private var byUser = true

        override fun afterTextChanged(s: Editable?) {


        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            if (!byUser) return

            byUser = false

            val t = this@ManipulatingEditText.text.toString()
            val m = convert(t.last())
            val s = t.substring(0, t.length - 1) + m
            this@ManipulatingEditText.setText("")
            this@ManipulatingEditText.setText(s)
            this@ManipulatingEditText.setSelection(this@ManipulatingEditText.text!!.length)

            byUser = true
        }
    }

    /*This is just an mock of my real implementation. But the same delay occurs*/
    fun convert(c: Char) : String {
        return c.toString()
    }

这是有效的:每个新的输入字符都通过convert(Char)函数进行转换。不幸的是,此解决方案慢得令人难以置信效率低下。每次输入后都会有短暂的延迟,您不能快速输入。

此解决方案不适用于生产应用。但是我还没有找到更好的解决方案(通过RxJava进行反跳或减振不起作用,因为跳过了某些字符或存在竞争条件)。

感谢任何想法,解决方案或帮助。

1 个答案:

答案 0 :(得分:1)

我改变了几件事,并发现拖延大大减少了,尽管我不能说哪个影响最大(如果有):

  • 通过直接操纵for代替了对setText的调用
  • 将文本操作从Editable回调移至onTextChanged回调,因为这是给我们afterTextChanged而不是Editable的回调
  • 简化了确定新文本的逻辑,希望这仍在按照您的意图进行;您提供的示例代码对我来说还不清楚

    CharSequence