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