如何使用InputConnectionWrapper?

时间:2011-07-08 14:55:57

标签: android input android-edittext user-input

我有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()也会因非用户输入而被触发,所以这也不是我正在寻找的。

3 个答案:

答案 0 :(得分:5)

事实证明,InputConnectionWrapper的上述用法完全正确。但是,commitText()永远不会被调用(特殊情况除外),因为还有其他方法在打字时使用。这些主要是setComposingText()sendKeyEvent()。但是,覆盖很少使用的方法(例如deleteSurroundingText()commitText())也很重要,以确保捕获每个用户输入。

答案 1 :(得分:1)

在聊天中建议您使用Blundell

TextWatcher。检查这是否有助于你。

答案 2 :(得分:0)

使用TextWatcher,在修改edittext时断开连接,并在完成后重新连接。这样,您就不会触发无限通话。