Android - 在不触发 onTextChanged 的情况下调用退格键
Android - Call backspace without firing onTextChanged
所以我目前正在开发一个应用程序,该应用程序接受用户输入,触发退格键以删除输入,然后添加一些其他文本。 (所以是的,我基本上是使用 TextWatcher 覆盖他们的输入)
没问题:当我调用 text.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
时,它会一次又一次地触发 onTextChanged。现在有什么方法可以在不再次触发 onTextChanged 的情况下删除用户输入吗?
谢谢!
不要从 onTextChanged 回调内部调度按键事件。您可以为文本保留一个内部缓冲区,并在每个有趣的按键事件上将整个 TextView 设置为该缓冲区。
您可能正在尝试进一步更改用户刚刚使用 TextWatcher
更改的文本。要做到这一点,最好的选择是使用 afterTextChanged
方法:
public abstract void afterTextChanged (Editable s)
This method is called to notify you that, somewhere within s, the text has been changed. It is legitimate to make further changes to s from this callback, but be careful not to get yourself into an infinite loop, because any changes you make will cause this method to be called again recursively.
为避免递归,您可以设置一个标志,表明您是更改文本的人,并在下一次调用时清除该标志。您还可以使用其他回调(beforeTextChanged
和 onTextChanged
)来收集有关更改的更多信息。
参考:http://developer.android.com/reference/android/text/TextWatcher.html
我通过调用 edittext.removeTextChangedListener(this);
修复了它,然后发送密钥,然后再次调用 edittext.addTextChangedListener(this);
。这也是一种干净的方法吗?很高兴听到您的意见。
所以我目前正在开发一个应用程序,该应用程序接受用户输入,触发退格键以删除输入,然后添加一些其他文本。 (所以是的,我基本上是使用 TextWatcher 覆盖他们的输入)
没问题:当我调用 text.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
时,它会一次又一次地触发 onTextChanged。现在有什么方法可以在不再次触发 onTextChanged 的情况下删除用户输入吗?
谢谢!
不要从 onTextChanged 回调内部调度按键事件。您可以为文本保留一个内部缓冲区,并在每个有趣的按键事件上将整个 TextView 设置为该缓冲区。
您可能正在尝试进一步更改用户刚刚使用 TextWatcher
更改的文本。要做到这一点,最好的选择是使用 afterTextChanged
方法:
public abstract void afterTextChanged (Editable s)
This method is called to notify you that, somewhere within s, the text has been changed. It is legitimate to make further changes to s from this callback, but be careful not to get yourself into an infinite loop, because any changes you make will cause this method to be called again recursively.
为避免递归,您可以设置一个标志,表明您是更改文本的人,并在下一次调用时清除该标志。您还可以使用其他回调(beforeTextChanged
和 onTextChanged
)来收集有关更改的更多信息。
参考:http://developer.android.com/reference/android/text/TextWatcher.html
我通过调用 edittext.removeTextChangedListener(this);
修复了它,然后发送密钥,然后再次调用 edittext.addTextChangedListener(this);
。这也是一种干净的方法吗?很高兴听到您的意见。