У меня есть 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 ()
также запускается при вводе не пользователем, так что это тоже не то, что я ищу.