且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在自定义编辑器视图中更新提取的文本

更新时间:2023-10-13 22:31:04

更新提取的文本视图的关键是设置ExtractedTextRequest令牌.没有令牌,更新将不会生效.感谢此答案以获取有关令牌的帮助.

The key to updating the extracted text view is to set the ExtractedTextRequest token. Without the token the updates don't take effect. Thanks to this answer for help with the token.

我们可以使用request.token在输入连接的getExtractedText()中标记令牌,然后将方法添加到自定义视图中进行设置:

We can the token in the input connection's getExtractedText() with request.token and then add a method to the custom view to set it:

@Override
public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) {
    if (request == null)
        return null;

    Editable editable = getEditable();
    if (editable == null) {
        return null;
    }

    // passing the token to the custom view here
    mMongolEditText.setExtractedTextToken(request.token);

    int selStart = Selection.getSelectionStart(editable);
    int selEnd = Selection.getSelectionEnd(editable);

    ExtractedText extract = new ExtractedText();
    extract.flags = 0;
    extract.partialStartOffset = -1;
    extract.partialEndOffset = -1;
    extract.selectionStart = selStart;
    extract.selectionEnd = selEnd;
    extract.startOffset = 0;
    if ((request.flags & GET_TEXT_WITH_STYLES) != 0) {
        extract.text = new SpannableString(editable);
    } else {
        extract.text = editable.toString();
    }
    return extract;
}

这使我可以在自定义视图中调用InputMethodManager.updateExtractedText()时使用令牌.

That allows me to use the token when I call InputMethodManager.updateExtractedText() from within my custom view.

private int mExtractedTextRequestToken = 0;

void setExtractedTextToken(int token) {
    mExtractedTextRequestToken = token;
}

private void reportExtractedText() {

    int requestToken = mExtractedTextRequestToken;

    ExtractedText et = new ExtractedText();
    final CharSequence content = getText();
    final int length = content.length();
    et.partialStartOffset = -1;
    et.partialEndOffset = -1;
    et.startOffset = 0;
    et.selectionStart = getSelectionStart();
    et.selectionEnd = getSelectionEnd();
    et.flags = 0;
    et.text = content.subSequence(0, length);

    InputMethodManager imm = (InputMethodManager) getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm == null) return;
    imm.updateExtractedText(this, requestToken, et);
}

您可以在这里查看我的完整代码:

You can view my full code here:

  • Custom view
  • Input connection