Permitir sólo 1 carácter en EditText y siempre sobrescribir cuando el usuario de entrada
Necesito hacer un EditText
que aceptaría solamente un carácter y un solo carácter (letra / alfa). Y si el usuario introduce otro carácter, debe reemplazar uno existente (como método de sobrescritura de entrada de texto con 1 símbolo permitido).
-
Sé cómo establecer la longitud máxima del texto en las propiedades. Pero si lo pongo en 1, entonces ningún otro carácter podría insertarse antes de que el usuario elimine uno existente. Pero quiero reemplazar el carácter existente con ese nuevo introducido automáticamente sin eliminación manual. ¿Como hacer eso?
- ¿Cómo utilizar Single TextWatcher para múltiples EditTexts?
- ¿Cómo elimino texto en EditText con TextWatcher? Cada vez que detecta una cadena y formatea su
- TextWatcher llamado incluso si se establece el texto antes de agregar el observador
- Android utiliza el observador de texto para evitar escribir caracteres especiales
- No se puede insertar en Editable
-
Sé fijar la propiedad para permitir solamente dígitos en un
EditText
, pero no puedo imaginar cómo permitir solamente los caracteres. Así que la segunda pregunta es cómo permitir que sólo los personajes enEditText
?
Actualmente estoy usando un EditText
con el tamaño máximo del texto = 2 con el código siguiente:
final EditText editLetter = (EditText)findViewById(R.id.editHouseLetter); editLetter.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { if (s!=null && s.length()>1){ editLetter.setText(s.subSequence(1, s.length())); editLetter.setSelection(1); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } });
El punto es, cuando un usuario introduce un segundo char, el primero debe ser eliminado. Hacer el tamaño de texto a 2 permite al usuario ingresar otro carácter después de que ya haya sido ingresado.
Realmente no entiendo cómo funciona, pero lo hace :). Y además tuve que apuntar el cursor en EditText
a la última posición porque siempre va al principio que hace que no pueda entrar nada en absoluto. No entiendo por qué es que tampoco.
El punto principal de esta solución es que tiene un 2-chars tamaño EditText
, pero quiero que 1-char tamaño. Y permite introducir cualquier cosa aparte de las letras (chars / alpha) y no quiero nada más que chars.
Utilizando el consejo proporcionado por sgarman y la función Character.isLetter()
, el método afterTextChanged
se ve así:
public void afterTextChanged(Editable s) { int iLen=s.length(); if (iLen>0 && !Character.isLetter((s.charAt(iLen-1)))){ s.delete(iLen-1, iLen); return; } if (iLen>1){ s.delete(0, 1); } }
He descubierto que usar Selection.setSelection
no es necesario en este caso. Ahora tiene un filtro que permite la entrada de letras solamente. Es casi la respuesta que quiero. La única cosa que queda es cómo hacer lo mismo con el tamaño de un símbolo EditText
?
- Android: evalúa EditText después de que el usuario termine de editar
- Android Manejo de muchos campos de EditText en un ListView
- Reemplazar el carácter dentro de TextWatcher en android
- Cómo enmascarar un EditText para mostrar el formato de fecha dd / mm / aaaa
- ¿Cómo usar la clase TextWatcher en Android?
- ¿Cómo utilizo AsYouTypeFormatter TextWatcher en la aplicación de Android?
- Necesita ayuda para que un TextWatcher de Android funcione con datos de código de barras compuesto entrantes
- Clase interna dentro de una interfaz que implementa la misma interfaz, ¿qué estamos logrando con esto?
Tratar:
s.delete(0, 1); Selection.setSelection(s, s.length());
Usted puede agregar esta sola línea a su archivo xml de la disposición, y androide hará las cosas para usted
android:maxLength="1"
Seguro que deberías añadirlo como una propiedad a la editText elemet, por ejemplo
<EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="text" android:maxLength="1" >
Me enfrenté al mismo problema y encontré que esta solución más fácil, sé que es una vieja pregunta, pero decidí poner mi respuesta para que sea más fácil para aquellos que abran este enlace.
Y no debo olvidar de agradecer al dueño de este blog , que de cito la respuesta!
Quería hacer lo mismo y usé tu código en afterTextChanged (Editable s) y también establecí un filtro en el editText como este.
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(2)});
Funcionó como queríamos.
- Clase emitida excepción en FrameLayout cuando estoy tratando de cambiar el orden de las vistas en el diseño xml?
- ¿Cómo obtener el nombre del paquete del lanzador actual en android?