android – 如何使用InputConnectionWrapper?

前端之家收集整理的这篇文章主要介绍了android – 如何使用InputConnectionWrapper?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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()也会在非用户输入上触发,所以这也不是,我正在寻找.

解决方法

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

猜你在找的Android相关文章