我有EditText
。现在,我想让用户对此EditText
进行所有更改,并在将其手动插入EditText
之前使用它们。我不希望用户直接更改EditText
中的文本。这应仅通过我的代码完成(例如,使用replace()
或setText()
)。
我搜索了一下,发现了一个名为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
- 子类中覆盖了以下方法:
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection con = super.onCreateInputConnection(outAttrs);
EditTextInputConnection connectionWrapper = new EditTextInputConnection(con, true);
return connectionWrapper;
}
但是,commitText()
永远不会被调用。当我在字段中输入一些文本时,onCreateInputConnection()
被调用,EditTextInputConnection
的构造函数也是,但从不commitText()
。至少,我就是这样理解InputConnectionWrapper
的用法。或者我错了吗?
修改:似乎commitText()
只会调用特殊字符,例如“。”,“”等等。我了解所有其他字符的Android源代码{{1}应该被召唤,但事实并非如此......我完全被困在这一点上。我已经尝试了InputConnectionWrapper.sendKeyEvent()
,但这仅适用于硬件键盘。所以这是别无选择......我真的不明白,为什么Android会处理与硬件键盘不同的软键盘。
EditText.onKeyPreIme()
也会因非用户输入而被触发,所以这也不是我正在寻找的。 p>
答案 0 :(得分:5)
事实证明,InputConnectionWrapper
的上述用法完全正确。但是,commitText()
永远不会被调用(特殊情况除外),因为还有其他方法在打字时使用。这些主要是setComposingText()
和sendKeyEvent()
。但是,覆盖很少使用的方法(例如deleteSurroundingText()
或commitText()
)也很重要,以确保捕获每个用户输入。
答案 1 :(得分:1)
TextWatcher。检查这是否有助于你。
答案 2 :(得分:0)
使用TextWatcher,在修改edittext时断开连接,并在完成后重新连接。这样,您就不会触发无限通话。