Как использовать InputConnectionWrapper?

У меня есть EditText . Теперь я хочу получить все изменения, внесенные пользователем в этот EditText , и поработать с ними, прежде чем вручную вставлять их в EditText . Я не хочу, чтобы пользователь напрямую изменял текст в EditText . Это должно выполняться только моим кодом (например, с помощью replace () или setText () ).

Я немного поискал и нашел интересный класс с именем InputConnectionWrapper . Согласно javadoc, он должен действовать как прокси для данного InputConnection . Итак, я разделил его на подклассы следующим образом:

private class EditTextInputConnection extends InputConnectionWrapper {

    public EditTextInputConnection(InputConnection target, boolean mutable) {
        super(target, mutable);
    }

    @Override
    public boolean commitText(CharSequence text, int newCursorPosition) {
                    // some code which takes the input and manipulates it and calls editText.getText().replace() afterwards
        return true;
    }

}

Для инициализации оболочки я перезаписал следующий метод в моем EditText -подклассе:

public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    InputConnection con = super.onCreateInputConnection(outAttrs);
    EditTextInputConnection connectionWrapper = new EditTextInputConnection(con, true);
    return connectionWrapper;
}

Однако commitText () никогда не вызывается. Вызывается onCreateInputConnection () и конструктор EditTextInputConnection , но никогда commitText () , хотя это должно быть, когда я ввожу текст в поле . По крайней мере, так я понимаю использование InputConnectionWrapper . Или я ошибаюсь?

Edit: Кажется, что commitText () вызывается только для специальных символов, таких как ".", "" И т. Д. Насколько я понимаю, исходный код Android для всех остальных characters InputConnectionWrapper.sendKeyEvent () должен быть вызван, но это не так ... Я абсолютно застрял на этом этапе. Я уже пробовал EditText.onKeyPreIme () , но это работает только на аппаратных клавиатурах. Так что альтернативы нет ... Я действительно не понимаю, почему Android обрабатывает программные клавиатуры, которые отличаются от аппаратных. EditText.onTextChanged () также запускается при вводе не пользователем, так что это тоже не то, что я ищу.

9
задан ubuntudroid 9 July 2011 в 15:03
поделиться