我想将用户输入的每个字符转换为另一个字符并显示在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进行反跳或减振不起作用,因为跳过了某些字符或存在竞争条件)。
感谢任何想法,解决方案或帮助。
答案 0 :(得分:1)
我改变了几件事,并发现拖延大大减少了,尽管我不能说哪个影响最大(如果有):
for
代替了对setText
的调用Editable
回调移至onTextChanged
回调,因为这是给我们afterTextChanged
而不是Editable
的回调简化了确定新文本的逻辑,希望这仍在按照您的意图进行;您提供的示例代码对我来说还不清楚
CharSequence