Quiero restringir los caracteres a 0-9, az, AZ y barra espaciadora solamente. Al establecer el tipo de entrada, puedo limitarlo a dígitos, pero no puedo entender las formas en que Inputfilter mira a través de los documentos.
android
android-edittext
Tim Wayne
fuente
fuente
InputFilter
Los s son un poco complicados en las versiones de Android que muestran sugerencias de diccionario. A veces se obtiene unSpannableStringBuilder
, a veces un planoString
en elsource
parámetro.Lo siguiente
InputFilter
debería funcionar. ¡Siéntase libre de mejorar este código!fuente
String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
source instanceof SpannableStringBuilder
ingresar AB me da AAB como cuando intento la respuesta anterior. Afortunadamente, pude solucionarlo usando la solución @florian a continuación.más fácil:
fuente
","
en el medio. Puede usar algo como esto"0123456789qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM"
imeOptions="actionNext"
, etc.Ninguna de las respuestas publicadas funcionó para mí. Vine con mi propia solución:
fuente
EditText
ya puede tener sus propios filtros, por ejemplo, filtro de longitud. Entonces, en lugar de anular los filtros, lo más probable es que desee agregar sus filtros a los ya existentes.Utilice este su trabajo 100% su necesidad y muy simple.
En strings.xml
fuente
Para evitar caracteres especiales en el tipo de entrada
Puede configurar el filtro para su texto de edición como a continuación
fuente
Además de la respuesta aceptada, también es posible usar, por ejemplo:
android:inputType="textCapCharacters"
como un atributo de<EditText>
, para aceptar solo letras mayúsculas (y números).fuente
Por alguna razón, el constructor de la clase android.text.LoginFilter tiene un alcance de paquete, por lo que no puede extenderlo directamente (aunque sería idéntico a este código). ¡Pero puede extender LoginFilter.UsernameFilterGeneric! Entonces solo tienes esto:
Esto no está realmente documentado, pero es parte de la biblioteca principal y la fuente es sencilla . Lo he estado usando durante un tiempo, hasta ahora no hay problemas, aunque admito que no he intentado hacer nada complejo que involucre spannables.
fuente
Es correcto, la mejor manera de solucionarlo en el propio diseño XML utilizando:
como acertadamente señaló Florian Fröhlich, funciona bien incluso para vistas de texto.
Solo una advertencia, los caracteres mencionados en el
android:digits
solo se mostrarán, así que tenga cuidado de no perder ningún conjunto de caracteres :)fuente
inputType
no afecta el filtrado.Esta solución simple funcionó para mí cuando necesitaba evitar que el usuario ingresara cadenas vacías en un EditText. Por supuesto, puede agregar más personajes:
fuente
Si subclasifica InputFilter, puede crear su propio InputFilter que filtraría los caracteres no alfanuméricos.
La interfaz InputFilter tiene un método,
filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
y le proporciona toda la información que necesita para saber qué caracteres se ingresaron en el EditText al que está asignado.Una vez que haya creado su propio InputFilter, puede asignarlo al EditText llamando a setFilters (...).
http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence , int, int, android.text.Spanned, int, int)
fuente
Ignorando las cosas de la extensión con las que otras personas se han ocupado, para manejar adecuadamente las sugerencias del diccionario, encontré que el siguiente código funciona.
La fuente crece a medida que crece la sugerencia, por lo que tenemos que ver cuántos caracteres realmente espera que reemplacemos antes de devolver cualquier cosa.
Si no tenemos caracteres no válidos, devuelva nulo para que ocurra el reemplazo predeterminado.
De lo contrario, debemos extraer los caracteres válidos de la subcadena que REALMENTE se colocará en EditText.
fuente
para evitar palabras en edittext. crea una clase que puedas usar en cualquier momento.
fuente
Primero agregue a
strings.xml
:XML :
Código en Kotlin:
Es extraño, pero funciona de forma extraña en el teclado suave del emulador.
¡Advertencia! El siguiente código filtrará todas las letras y otros símbolos, excepto los dígitos para los teclados de software. Solo el teclado digital aparecerá en los teléfonos inteligentes.
Asimismo, establecer por lo general
maxLength
,filters
,inputType
.fuente
Este es un hilo antiguo, pero las soluciones propuestas tienen problemas (dependiendo del dispositivo / versión de Android / Teclado).
ENFOQUE DIFERENTE
Así que finalmente fui con un enfoque diferente, en lugar de usar la
InputFilter
implementación problemática, estoy usandoTextWatcher
y elTextChangedListener
deEditText
.CÓDIGO COMPLETO (EJEMPLO)
La razón por la
InputFilter
que no es una buena solución en Android es que depende de la implementación del teclado. La entrada del teclado se está filtrando antes de pasar la entrada alEditText
. Pero, dado que algunos teclados tienen implementaciones diferentes para laInputFilter.filter()
invocación, esto es problemático.Por otro lado,
TextWatcher
no le importa la implementación del teclado, nos permite crear una solución simple y asegurarnos de que funcione en todos los dispositivos.fuente
onTextChanged
simplemente necesita unpublic void
frente.He hecho algo como esto para que sea simple:
De esta manera, estamos reemplazando todos los caracteres no deseados en la nueva parte de la cadena de origen con una cadena vacía.
La
edit_text
variable es elEditText
objeto al que nos referimos.El código está escrito en
kotlin
.fuente
Es posible de usar
setOnKeyListener
. ¡En este método, podemos personalizar la entradaedittext
!fuente
Así es como creé el filtro para el campo Nombre en Editar texto. (La primera letra es MAYÚSCULAS, y permite solo un espacio después de cada palabra.
fuente
Tengo la misma respuesta en Kotlin:
y obtener la clase con una función de extensión:
fuente