Как использовать InputConnectionWrapper? - PullRequest
9 голосов
/ 08 июля 2011

У меня есть 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.Или я не прав?

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

Ответы [ 3 ]

5 голосов
/ 15 июля 2011

Оказалось, что приведенное выше использование InputConnectionWrapper было полностью правильным. Однако commitText() никогда не вызывается (за исключением особых случаев), так как существуют другие методы, которые используются во время набора текста. В основном это setComposingText() и sendKeyEvent(). Тем не менее, также важно переписать редко используемые методы, такие как deleteSurroundingText() или commitText(), чтобы убедиться, что перехватывает каждый пользовательский ввод.

1 голос
/ 09 июля 2011

Blundell предложил в чате использовать TextWatcher . Проверьте, поможет ли это вам.

0 голосов
/ 16 января 2014

Используйте TextWatcher, отключите его, когда вы изменяете текст редактирования, и снова подключите его, когда закончите. Таким образом, вы не будете запускать бесконечные вызовы.

...