如何在用户更改选择时将组合文本提交到InputConnection

时间:2017-07-20 04:48:42

标签: android custom-keyboard android-input-method inputconnection

我正在制作custom keyboard并且必须在提交之前设置撰写文本。这在this Q&A

中有所描述

我知道如何提交一般文字

inputConnection.commitText("text", 1);

但是如果用户通过触摸EditText的另一部分来更改光标位置,我不知道如何提交它。从观察其他键盘我知道它是可能的,因为他们这样做。但是在我的键盘上,如果我有

inputConnection.setComposingText("text", 1);

然后改变光标位置,留下构图范围。任何将来的更改都将替换组成范围,而不是在新光标位置输入。

帖子Android EditText listener for cursor position change提供了一些关于您可以对EditText做些什么的建议,但在自定义键盘内我无法访问EditText,除了InputConnection 1}}给了我。

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

keep在我开始编写问题后找到问题的答案。我将在下面发布答案。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

编辑器(EditText等)在updateSelection上调用InputMethodManageronUpdateSelection会通知finishComposingText听众。因此,键盘可以覆盖onUpdateSelection并处理那里未完成的组合范围。

要处理未完成的作曲范围,您可以使用InputConnection上的sample Android soft keyboard。这将删除撰写范围并提交范围内的任何文本。

以下是id command

中的实施方式
/**
 * 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();
        }
    }
}