如何使用InputConnectionWrapper?

我有一个EditText 。 现在我想让用户对这个EditText所做的所有更改,并在手动插入EditText之前使用它们。 我不希望用户直接更改EditText的文本。 这应该只能通过我的代码(例如通过使用replace()setText() )来完成。

我search了一下,发现了一个名为InputConnectionWrapper的有趣的类。 根据javadoc,它将作为给定InputConnection的代理。 所以我就这样分类:

 private class EditTextInputConnection extends InputConnectionWrapper { public EditTextInputConnection(InputConnection target, boolean mutable) { super(target, mutable); } @Override public boolean commitText(CharSequence text, int newCursorPosition) { // some code which takes the input and manipulates it and calls editText.getText().replace() afterwards return true; } } 

要初始化包装器,我在我的EditText -subclass中覆盖了以下方法:

 public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection con = super.onCreateInputConnection(outAttrs); EditTextInputConnection connectionWrapper = new EditTextInputConnection(con, true); return connectionWrapper; } 

但是, commitText()永远不会被调用。 onCreateInputConnection()被调用, EditTextInputConnection也是构造EditTextInputConnection ,但从来没有commitText() ,尽pipe它应该是,当我在字段中input一些文本。 至less,这就是我理解InputConnectionWrapper的用法。 还是我错了?

编辑:看来, commitText()只被称为像“。”,“”等特殊字符。据我所知,所有其他字符的Android源代码InputConnectionWrapper.sendKeyEvent()应该被调用,但事实并非如此。我完全停留在这一点上。 我已经尝试过EditText.onKeyPreIme() ,但这只适用于硬件键盘。 所以这是没有其他的select…我不明白,为什么Android处理与硬件键盘不同的软键盘。 EditText.onTextChanged()也被触发非用户input,所以这也不是,我在找什么。

Related of "如何使用InputConnectionWrapper?"

原来, InputConnectionWrapper的上述用法是完全正确的。 但是, commitText()从来不会被调用(特殊情况除外),因为在键入过程中还有其他方法。 这些主要是setComposingText()sendKeyEvent() 。 但是,覆盖很less使用的方法(如deleteSurroundingText()commitText()以确保捕获每个用户input也很重要。

Blundell在聊天中build议您使用TextWatcher 。 检查这是否帮助你。

使用TextWatcher,在修改edittext时断开连接,并在完成时重新连接。 这样,你将不会触发无限的呼叫。