tipos - mascara edittext android
Establecer el cursor al comienzo del texto insertado con InputConnection.commitText (1)
La documentación para InputConnection.commitText(CharSequence text, int newCursorPosition)
dice que newCursorPosition
significa:
int: la nueva posición del cursor alrededor del texto, en caracteres Java. Si> 0, esto es relativo al final del texto - 1; si <= 0, esto es relativo al comienzo del texto. Por lo tanto, un valor de 1 siempre avanzará el cursor a la posición después de insertar el texto completo. Tenga en cuenta que esto significa que no puede colocar el cursor dentro del texto, porque el editor puede realizar modificaciones en el texto que está proporcionando, por lo que no es posible especificar ubicaciones allí correctamente.
En este ejemplo , si ingreso dos caracteres, coloque el cursor entre ellos como este
y luego ingrese otro carácter, no importa si configuro newCursorPosition
en 0
o 1
. El cursor siempre está al final de la inserción. Por ejemplo, llamar
inputConnection.commitText("aaa", 0);
o
inputConnection.commitText("aaa", 1);
Ambos muestran el cursor así:
Si lo hago -1
con
inputConnection.commitText("aaa", -1);
entiendo esto
Los resultados 1
y -1
se esperan según la documentación. ¿Por qué 0
no coloca el cursor al comienzo de la inserción? Esperaría que 0
debería ser así
inputConnection.commitText("aaa", 0);
pero no lo es Por qué no?
Esto parece un defecto en el código, pero tú eres el juez.
Eche un vistazo a replaceText () en BaseInputConnection
. Creo que este es el código que coloca el cursor después de la inserción. ( replaceText()
se llama desde commitText())
.
En el código al que se hace referencia, a
es el inicio de la selección. b
es el final de la selección. Como no hay selección en el ejemplo y el cursor está en el índice 1, entonces a == b == 1
. Además, el nuevo texto (aaa) no está insertado (reemplazando una selección [a, b]) hasta que el cursor se mueva a la nueva selección.
Selection.setSelection(content, newCursorPosition)
establece la posición del cursor, por lo que para que 0 y 1 produzcan un posicionamiento idéntico en su ejemplo, esperaría que el valor derivado de newCursorPosition
sea el mismo para ambas entradas.
Con el cursor posicionado entre los dos 8 en la posición 1, pensemos en el siguiente código:
if (newCursorPosition > 0) {
newCursorPosition += b - 1;
} else {
newCursorPosition += a;
}
Para su entrada de 1, newCursorPosition
> 0, entonces newCursorPosition = newCursorPosition + 1 - 1 o 1.
Para su entrada de 0, newCursorPosition
no es = 0, entonces newCursorPosition = newCursorPosition + a (0 + 1) o 1.
Como ambas entradas producen el mismo valor, esperaría que Selection.setSelection(content, newCursorPosition)
produjera los resultados que usted ve.
No he seguido el código exactamente a esta ubicación, pero creo que este es el problema. He seguido las rutas de ejecución en BaseInputConnection
para newCursorPosition = 0
y newCursorPosition = 1
en un emulador de Pixel con API 21 y lo que se describe anteriormente se mantiene.