gpt4 book ai didi

android - 如何使用 InputConnectionWrapper?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:43 26 4
gpt4 key购买 nike

我有一个 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-subclass 中覆盖了以下方法:

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

最佳答案

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

关于android - 如何使用 InputConnectionWrapper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com