我有一个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源代码应该调用InputConnectionWrapper.sendKeyEvent(),但事实并非如此.我完全陷入困境.我已经尝试过EditText.onKeyPreIme(),但这仅适用于硬件键盘.所以这是别无选择……我真的不明白,为什么Android会处理与硬件键盘不同的软键盘.
EditText.onTextChanged()也会在非用户输入上触发,所以这也不是,我正在寻找.