WebView с пользовательским InputConnection не допускает внешнего вставки - PullRequest
0 голосов
/ 07 марта 2020

У меня есть Android WebView, который я использую для редактирования (делая его contenteditable). Мне также нужно захватить определенные нажатия клавиш во время набора текста. Я не могу сделать это в Javascript (так как Android WebView не отправляет полезные данные нажатия клавиш), поэтому мне пришлось создать пользовательский InputConnection.

. Проблема в том, что я могу вставить текст из другого приложения в веб-просмотр. Я могу вставить текст, скопированный из одного и того же веб-просмотра.

Если я заберу свой пользовательский MyInputConnection, я могу вставить любой из них.

В моем классе веб-просмотра У меня есть это:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    InputConnection ic = super.onCreateInputConnection(outAttrs);
    if (ic != null) {
        //noinspection UnnecessaryLocalVariable
        InputConnection mic = new MyInputConnection(ic);
        return sic;
    }
    return ic;
}

А затем, в MyInputConnection, почти все (за исключением commitText, где выполняется обработка ключа) просто отправляется на исходный InputConnection:

MyInputConnection создается просто:

    InputConnection IC;

    MyInputConnection(InputConnection inputConnection) {
        IC = inputConnection;
    }

, и большинство вещей в нем обрабатываются как:

    @Override
    public CharSequence getTextBeforeCursor(int n, int flags) {
        return IC.getTextBeforeCursor(n, flags);
    }

(Примечание: я пытался просто расширить BaseInputConnection и отправляет большинство вызовов на super, но по любой причине, которая приводит к тому, что подсказки набора текста на программной клавиатуре не отображаются. И внешняя вставка также не работает в этом случае.)

// No soft-keyboard typing suggestions:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    //noinspection UnnecessaryLocalVariable
    InputConnection mic = new MyInputConnection(this);
    return mic;
}

...

    // MyInputConnection:

    MyInputConnection(WebView view) {
        super(view, true);
    }

    @Override
    public CharSequence getTextBeforeCursor(int n, int flags) {
        return super.getTextBeforeCursor(n, flags);
    }
...