type tipos style studio propiedades mascara example eventos edittext android android-edittext inputconnection

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.