1

我正在制作一个自定义键盘,并且必须在提交之前设置组合文本。这在本问答中有所描述。

我一般都知道如何提交文本

inputConnection.commitText("text", 1);

但是如果用户通过触摸EditText. 通过观察其他键盘,我知道这是可能的,因为他们这样做了。但是在我的键盘上,如果我有

inputConnection.setComposingText("text", 1);

再改变光标位置,留下作曲跨度。将来的任何更改都将替换组成跨度,而不是在新的光标位置输入。

用于光标位置更改的Android EditText 后监听器为您可以对 a 做什么提供了一些想法,但在自定义键盘中,除了给我EditText的内容外,我无法访问。EditTextInputConnection

我如何处理知道光标/选择何时移动?

在我开始写它之后,我一直在寻找我的问题的答案。我将在下面发布答案。

4

2 回答 2

1

编辑器(EditText等)调用updateSelectionInputMethodManager然后通知onUpdateSelection监听器。因此,键盘可以覆盖onUpdateSelection和处理那里未完成的作曲范围。

要处理未完成的作曲跨度,您可以finishComposingTextInputConnection. 这将删除组成跨度并提交跨度中的任何文本。

以下是它在示例 Android 软键盘中的实现方式:

/**
 * Deal with the editor reporting movement of its cursor.
 */
@Override public void onUpdateSelection(int oldSelStart, int oldSelEnd,
        int newSelStart, int newSelEnd,
        int candidatesStart, int candidatesEnd) {
    super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd,
            candidatesStart, candidatesEnd);

    // If the current selection in the text view changes, we should
    // clear whatever candidate text we have.
    if (mComposing.length() > 0 && (newSelStart != candidatesEnd
            || newSelEnd != candidatesEnd)) {
        mComposing.setLength(0);
        updateCandidates();
        InputConnection ic = getCurrentInputConnection();
        if (ic != null) {
            ic.finishComposingText();
        }
    }
}
于 2017-07-20T04:48:41.663 回答
1

https://chromium.googlesource.com/android_tools/+/refs/heads/master/sdk/sources/android-25/android/widget/Editor.java#1604

int candStart = -1;
int candEnd = -1;
if (mTextView.getText() instanceof Spannable) {
  final Spannable sp = (Spannable) mTextView.getText();
  candStart = EditableInputConnection.getComposingSpanStart(sp);
  candEnd = EditableInputConnection.getComposingSpanEnd(sp);
}
于 2021-01-03T12:40:14.487 回答