Tengo un EditText
. Ahora quiero obtener todos los cambios realizados por el usuario en este EditText
y trabajar con ellos antes de insertarlos manualmente en el EditText
. No deseo que el usuario cambie directamente el texto en el EditText
. Esto solo debe hacerlo mi código (por ejemplo, usando replace()
o setText()
).Cómo usar InputConnectionWrapper?
Busqué un poco y encontré una clase interesante llamada InputConnectionWrapper
. De acuerdo con el javadoc actuará como un proxy para un dado InputConnection
. Así que una subclase de esta manera:
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;
}
}
Para inicializar la envoltura I sobreescribí el siguiente método en mi EditText
-subclass:
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection con = super.onCreateInputConnection(outAttrs);
EditTextInputConnection connectionWrapper = new EditTextInputConnection(con, true);
return connectionWrapper;
}
Sin embargo, no se llama a commitText()
. El onCreateInputConnection()
es llamado y el constructor de EditTextInputConnection
también, pero nunca commitText()
, Altough debe ser, cuando entro en algún texto en el campo. Al menos, así entiendo el uso de InputConnectionWrapper
. ¿O estoy equivocado?
Editar: " 'Parece, que commitText()
sólo se le llama para caracteres especiales como,'", etc. A mi entender el código fuente de Android para todos los demás caracteres InputConnectionWrapper.sendKeyEvent()
debería ser llamado, pero ese no es el caso .. Estoy absolutamente estancado en este punto. Ya probé EditText.onKeyPreIme()
, pero esto solo funciona en teclados de hardware. Entonces no hay alternativa ... Realmente no entiendo, por qué Android maneja teclados suaves que son diferentes de los teclados de hardware. EditText.onTextChanged()
también se dispara en la entrada de no usuario, por lo que esto tampoco es lo que estoy buscando.
Esto no impide que el usuario copie y pegue texto aleatorio en EditText, pero funciona para todo lo demás. – Alexey
@Alexey Eso es correcto, buen punto. – ubuntudroid
@ubuntudroid Hola, ¿sabes qué métodos se deben sobrescribir para capturar todas las entradas? Incluyendo copiar pegar. –