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