Conexión de entrada: ¿cómo eliminar el texto seleccionado?

Hice un teclado personalizado para Android. Cuando presiono el botón de retroceso de mi teclado, uso

getCurrentInputConnection().deleteSurroundingText(1, 0); 

Para eliminar una letra del campo de entrada. Pero cuando selecciono un texto y luego presione el botón de retroceso, el texto seleccionado no se elimina. ¿Qué método de conexión de entrada debo utilizar para que el texto seleccionado también se elimina de mi teclado cuando presiono el botón de retroceso?

Llama a getCurrentInputConnection().commitText("",1);

Al borrar necesitas tener en cuenta las siguientes situaciones:

  • Hay una selección de composición.
  • El editor / usuario tiene una selección de cursor en el texto.
  • No hay selección de ningún tipo.

Si hay una selección, entonces debe ser eliminado. Si no hay selección, el carácter delante del cursor debe ser borrado.

Solución 1

Al principio utilicé este método. Me gusta porque sólo utiliza la conexión de entrada.

 CharSequence selectedText = inputConnection.getSelectedText(0); if (TextUtils.isEmpty(selectedText)) { // no selection, so delete previous character inputConnection.deleteSurroundingText(1, 0); } else { // delete the selection inputConnection.commitText("", 1); } 

Mientras la conexión de entrada esté utilizando el método BaseInputConnection.deleteSurroundingText predeterminado, esto debería estar bien. Sin embargo, debe tenerse en cuenta que la documentación advierte

Los autores de IME: tenga cuidado de no borrar sólo la mitad de un par sustituto. También tenga cuidado de no borrar más caracteres que en el editor, ya que pueden tener efectos nocivos en la aplicación.

Si alguna vista personalizada utiliza una conexión de entrada que no comprueba correctamente la longitud del texto o los pares sustitutivos, esto podría provocar un bloqueo. A pesar de que este es un senario poco probable, si utiliza esta solución, entonces usted debe agregar ese código de verificación adicional aquí.

Esto puede ser la razón por la que el teclado de ejemplo de Android primero comprueba si hay un período de composición, y si no lo está utilizando la siguiente solución.

Solución 2

También puede utilizar la conexión de entrada para enviar un KeyEvent con KEYCODE_DEL . En mi opinión, esto no es tan bueno porque es un teclado suave disfrazado de teclado duro. Pero muchos teclados hacen esto. Cuando estaba haciendo una vista personalizada que aceptó entrada de teclado , tuve que manejar borrados como KeyEvent , es decir, independientemente de la conexión de entrada (porque la conexión de entrada no estaba borrando el texto).

Tan apenas envíe el mensaje de la cancelación como KeyEvent (como si usted estuviera presionando una llave dura del teclado abajo y después dejándola para arriba).

 getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL)); getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL)); 

Esto funciona como se esperaba. Elimina la selección si la hay o elimina un carácter detrás del cursor si no hay una selección. (Sin embargo, debe manejar cualquier período de composición por separado.)

Gracias a esta respuesta para la idea.

  • Android: ¿Cómo hacer que el botón en la vista del candidato en el teclado virtual?
  • ICS teclado de vuelta, los botones de inicio no tomar contacto cuando se abre en la superposición
  • Android: Editar texto Ir botón
  • Android: cambiar a otro IME de forma programática
  • Android IME: muestra un cuadro de diálogo emergente personalizado (como el teclado Swype) que puede introducir texto en el TextView
  • Cómo cargar una distribución de teclado diferente para subtipo en android?
  • Retener soft-input / IME state en el cambio de orientación
  • ¿Qué es exactamente "id == EditorInfo.IME_NULL"?
  • Android: Añadir imageButton encima de un teclado personalizado
  • Disposición de teclado personalizada de Android dejando un margen de blanco en el lateral
  • Teclado IME con emojis
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.