Как сделать так, чтобы моя поддержка InputConnection создавалась идеально? - PullRequest
0 голосов
/ 07 февраля 2019

В настоящее время я работаю над пользовательским текстовым представлением (не расширяющим текстовое представление), которое имеет более высокую скорость рисования, в то время как сейчас у меня возникают некоторые действительно сложные проблемы с входным соединением (или, точнее, составлением).

Я хочу поддержать компоновку в моем редакторе, но я обнаружил, что InputMethodEngine не вызывает 'setComposingRegion' или 'setComposingText', когда мой курсор обновляется, даже если я вызвал метод viewClicked для InputMethodManager.Составляющий текст просто останься там!

Например, я щелкнул слово «он» в моем редакторе, а затем появляется InputMethod и отображает серьезные тексты сочинения «он», такие как «ад» или «привет».

Затем я щелкнул слово «в» в моем редакторе, но InputMethod не вызывает «setComposingRegion» или «setComposingText», он просто продолжает показывать тексты «он»!

Я использую эмулятор Pixel (API 28, x86).Я также назвал «updateSelection» и предоставил значение initialSelStart / End в «onCreatInputConnection», как говорит AndroidAPI, но оно также не работает.

public void onClick() {
.....
    if (_IMM != null) {
        _IMM.viewClicked(this);
        _IMM.showSoftInput(this, 0);
        onCursorUpdate();
    }
.....
}

private void onCursorUpdate() {
    if (_IMM != null)
        _IMM.updateSelection(this, _SStart, (_SStart == -1) ? -1 : _SEnd, _ComposingStart, (_ComposingStart == -1) ? -1 : _ComposingEnd);
}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    outAttrs.imeOptions = EditorInfo.IME_NULL
        | EditorInfo.IME_FLAG_NO_ENTER_ACTION
        | EditorInfo.IME_FLAG_NO_FULLSCREEN
        | EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION;
    outAttrs.inputType = EditorInfo.TYPE_MASK_CLASS
        | EditorInfo.TYPE_CLASS_TEXT
        | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
        | EditorInfo.TYPE_TEXT_FLAG_IME_MULTI_LINE;
    outAttrs.initialSelStart = _SStart;
    outAttrs.initialSelEnd = (_SStart == -1) ? -1 : _SEnd;
    if (_InputConnection == null)
        _InputConnection = new VInputConnection(this);
    _isComposing = false;
    return _InputConnection;
}

Я ожидаю, что IME (InputMethodEngine) изменит свой регион составления, как я назвал 'viewClicked', но это не так.

Вот список изображений:

Нажмите на слово, и появится IME
Нажмите на другое слово, но IME продолжит отображать предыдущую композицию

...