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?
- Android IME: muestra un cuadro de diálogo emergente personalizado (como el teclado Swype) que puede introducir texto en el TextView
- Cómo agregar scrollview a keyboardView en android
- Android: Cómo configurar el modo de vista de teclado preferido desde IME
- Cambiar el diseño del teclado dinámicamente
- ¿Qué es exactamente "id == EditorInfo.IME_NULL"?
- ¿Cómo determinar el IME actual en Android?
- Cómo establecer el IME por defecto en portar Android?
- "IME murió" y android.os.DeadObjectException
- ¿Cómo puedo manejar ImeOptions?
- Android: la fila del teclado personalizado no está centrada
- ¿Es posible tener múltiples métodos de entrada activos en Android?
- Android setOnEditorActionListener () no se dispara
- Aplicación personalizada de Android IME predeterminada en el teclado de pantalla
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.