Quiero definir un valor mínimo y máximo para un EditText
.
Por ejemplo: si alguna persona intenta ingresar un valor de mes en él, el valor debe estar entre 1-12.
Puedo hacerlo usando TextWatcher
pero quiero saber si hay alguna otra forma de hacerlo en el archivo de diseño o en otro lugar.
Editar: no quiero limitar el recuento de caracteres. Quiero limitar el valor Por ejemplo, si limito los EditText
caracteres del mes w cuando ingreso 12, lo aceptará, pero si ingreso 22 no debe aceptarlo mientras estoy ingresando.
android
android-edittext
mertaydin
fuente
fuente
Respuestas:
Primero haz esta clase:
Luego use esto de su Actividad:
Esto permitirá al usuario ingresar valores del 1 al 12 solamente .
EDITAR:
Establezca su texto de edición con
android:inputType="number"
.Puede encontrar más detalles en https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/ .
Gracias.
fuente
source
reemplazarán algunos caracteres endest
. Creo que debe simular el reemplazo y obtener el resultado final, luego validarlo.Hay un pequeño error en el código de Pratik. Por ejemplo, si un valor es 10 y agrega un 1 al principio para hacer 110, la función de filtro tratará el nuevo valor como 101.
Vea a continuación una solución a esto:
fuente
String replacement = source.subSequence(start, end).toString(); String newVal = dest.subSequence(0, dstart).toString() + replacement + dest.subSequence(dend, dest.length()).toString();
String newVal= dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend, dest.toString().length());
, se ve más limpio y claro.min==3
es imposible escribir cualquier número que comience con 1 o 2 (ej .: 15, 23)De lo que he visto de la solución de @ Patrik y la adición de @ Zac, el código provisto todavía tiene un gran problema:
Si
min==3
es imposible escribir cualquier número que comience con 1 o 2 (ej .: 15, 23)Si
min>=10
es imposible escribir algo, ya que cada número tendrá que comenzar con 1,2,3 ...Según tengo entendido, no podemos lograr la limitación min-max del
EditText
valor de an con el simple uso de la claseInputFilterMinMax
, al menos no para el valor min, porque cuando el usuario escribe un número positivo, el valor aumenta y podemos realizar fácilmente un prueba sobre la marcha para verificar si ha alcanzado el límite o si se salió del rango y bloquea las entradas que no cumplen. Probar el valor mínimo es una historia diferente, ya que no podemos estar seguros de si el usuario ha terminado de escribir o no y, por lo tanto, no podemos decidir si debemos bloquear o no.No es exactamente lo que OP solicitó, pero para fines de validación, combiné en mi solución una
InputFilter
para probar los valores máximos, con unaOnFocusChangeListener
nueva prueba para el valor mínimo cuandoEditText
pierde el foco asumiendo que el usuario terminó de escribir y es algo así:Y
OnFocusChangeListenerMin
A continuación, en la Actividad establecer el
InputFilterMax
y elOnFocusChangeListenerMin
aEditText
Nota: Puede 2 min y tanto en el máximoonFocusChangeListener
.fuente
if(Integer.valueOf(val)<min){ //Notify user that the value is not good }
. Puede hacer lo que quiera allí, notificar al usuario y configure EditText en blanco, no sé si esto responde a su preguntaExtensión de la respuesta de Pratik y Zac. Zac arregló un pequeño error de Pratik en su respuesta. Pero noté que el código no admite valores negativos, arrojará una excepción NumberFormatException. Para arreglar eso y permitir que el MIN sea negativo, use el siguiente código.
Agregue esta línea (en negrita) entre las otras dos líneas:
newVal = newVal.substring (0, dstart) + source.toString () + newVal.substring (dstart, newVal.length ());
if (newVal.equalsIgnoreCase ("-") && min <0) devuelve nulo;
int input = Integer.parseInt (newVal);
fuente
Si necesita un rango con números negativos como -90: 90, puede usar esta solución.
fuente
Extendí el código @Pratik Sharmas para usar objetos BigDecimal en lugar de ints para que pueda aceptar números más grandes y tener en cuenta cualquier formato en EditText que no sea un número (como el formato de moneda, es decir, espacios, comas y puntos)
EDITAR: tenga en cuenta que esta implementación tiene 2 como las cifras mínimas significativas establecidas en BigDecimal (vea la constante MIN_SIG_FIG) como la usé para la moneda, por lo que siempre había 2 números iniciales antes del punto decimal. Modifique la constante MIN_SIG_FIG según sea necesario para su propia implementación.
fuente
Encontré mi propia respuesta. Es muy tarde ahora pero quiero compartirlo contigo. Implemento esta interfaz:
Y luego impleméntalo de esta manera dentro de tu actividad:
Esta es una respuesta muy simple, si es mejor, dígame.
fuente
Hay algo mal en la respuesta aceptada.
Si muevo el cursor al centro del texto, luego escribo algo, entonces la declaración anterior producirá un resultado incorrecto. Por ejemplo, escriba "12" primero, luego escriba "0" entre 1 y 2, luego la declaración mencionada anteriormente producirá "120" en lugar de 102. Modifiqué esta declaración a las siguientes declaraciones:
fuente
Kotlin si alguien lo necesita (Use Utilities)
Luego usa esto de tu clase de Kotlin
Este EditText permite de 1 a 100.
Luego usa esto desde tu XML
fuente
Hice una forma más simple de establecer un mínimo / máximo en un Edittext. Uso el teclado aritmético y trabajo con este método:
El método acepta todos sus valores, pero si un valor de usuarios no cumple con sus límites, se establecerá automáticamente en el límite mínimo / máximo. Por ej. limit limin = 10, limax = 80 si el usuario establece 8, automáticamente 10 se guarda en una variable y EditText se establece en 10.
fuente
Sé que ya hay un millón de respuestas a esto, con una aceptada. Sin embargo, hay numerosos errores en la respuesta aceptada y la mayoría del resto simplemente corrige uno (o tal vez dos) de ellos, sin expandirse a todos los casos de uso posibles.
Así que básicamente compilé la mayoría de las correcciones de errores sugeridas en las respuestas de soporte, así como agregué un método para permitir la entrada continua de números fuera del rango en la dirección de 0 (si el rango no comienza en 0), al menos hasta que sea seguro de que ya no puede estar en el rango. Para ser claros, este es el único momento que realmente causa problemas con muchas de las otras soluciones.
Aquí está la solución:
Tenga en cuenta que algunos casos de entrada son imposibles de manejar "activamente" (es decir, como el usuario lo está ingresando), por lo que debemos ignorarlos y manejarlos después de que el usuario haya terminado de editar el texto.
Así es como puede usarlo:
Ahora, cuando el usuario intenta escribir un número más cercano a 0 de lo que permite el rango, sucederá una de dos cosas:
Si
min
ymax
tienen el mismo número de dígitos, no se les permitirá ingresarlo una vez que lleguen al último dígito.Si se deja un número fuera del rango en el campo cuando el texto pierde el foco, se ajustará automáticamente al límite más cercano.
Y, por supuesto, al usuario nunca se le permitirá ingresar un valor más alejado de 0 que el rango permitido, ni es posible que un número como ese esté "accidentalmente" en el campo de texto por este motivo.
¿Problemas conocidos?)
EditText
pierde el foco cuando el usuario termina con él.La otra opción es desinfectar cuando el usuario presiona la tecla "listo" / regresar, pero en muchos o incluso en la mayoría de los casos, esto causa una pérdida de enfoque de todos modos.
Sin embargo, cerrar el teclado virtual no desenfocará automáticamente el elemento. Estoy seguro de que el 99.99% de los desarrolladores de Android desearían que lo hiciera (y que el manejo del enfoque en los
EditText
elementos fue menos problemático en general), pero hasta el momento no hay una funcionalidad incorporada para ello. El método más fácil que he encontrado para solucionar esto, si es necesario, es extenderEditText
algo como esto:Esto "engañará" al filtro para que desinfecte la entrada aunque la vista no haya perdido el foco. Si la vista luego pierde el foco por sí misma, el saneamiento de entrada se activará nuevamente, pero nada cambiará ya que ya se solucionó.
Clausura
Uf. Eso fue mucho. Lo que originalmente parecía ser un problema bastante trivialmente fácil, terminó descubriendo muchas pequeñas piezas feas de Android de vainilla (al menos en Java). Y una vez más, solo necesita agregar el oyente y extenderlo
EditText
si su rango no incluye 0 de alguna manera. (Y de manera realista, si su rango no incluye 0 pero comienza en 1 o -1, tampoco tendrá problemas).Como última nota, esto solo funciona para ints . Ciertamente, hay una manera de implementarlo para que funcione con decimales (
double
,float
), pero como ni yo ni el autor de la pregunta original lo necesitamos, no quiero profundizar en ello. Sería muy fácil usar simplemente el filtrado posterior a la finalización junto con las siguientes líneas:Solo tendría que cambiar de
int
afloat
(odouble
), permitir la inserción de un solo.
(o,
, ¿según el país?), Y analizar como uno de los tipos decimales en lugar de anint
.De todos modos, maneja la mayor parte del trabajo, por lo que funcionaría de manera muy similar.
fuente
fuente
Ejemplo muy simple en Kotlin:
fuente
por favor revise este código
Use el siguiente enlace para obtener más detalles sobre edittext y los edittextfilteres con text watcher.
http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/
fuente
Si solo le preocupa el límite máximo, simplemente agregue la siguiente línea en
Si necesita agregar un límite mínimo, puede hacerlo de esta manera, en este caso, el límite mínimo es 7. el usuario tiene restricciones para ingresar caracteres entre el límite mínimo y máximo (entre 8 y 10)
Si también necesita restringir al usuario para que ingrese 01 al inicio, modifique si la condición de esta manera
Al final, llame al método como
fuente
@Pratik Sharma
Para admitir números negativos , agregue el siguiente código dentro del método de filtro :
Luego use esto de su Actividad:
Establezca su texto de edición con:
fuente
// todavía tiene algún problema, pero aquí puede usar min, max en cualquier rango (positivo o negativo)
fuente
Para agregar a la respuesta de Pratik, aquí hay una versión modificada donde el usuario puede ingresar un mínimo de 2 dígitos también, por ejemplo, de 15 a 100:
Espero que esto ayude. amablemente no desestime sin razones.
fuente
esta es la forma en que lo he usado, funciona para un número negativo
Primero, cree la clase MinMaxFIlter.java con el siguiente código:
Luego, cree y configure su filtro para su texto de edición de esta manera:
fuente
este es mi código max = 100, min = 0
xml
Java
fuente
Puede hacer esto con un InputFilter. Aparentemente, solo puede usar esta interfaz de filtro de entrada. Antes de hacerlo de la manera molesta y crear una nueva clase que amplíe el filtro de entrada, puede usar este acceso directo con una instancia de interfaz de clase interna.
Por lo tanto solo haces esto:
En este ejemplo, verifico si el valor de EditText es mayor que 8. De lo contrario, se establecerá en 8. Aparentemente, debe calcular el mínimo máximo o cualquier lógica de filtro por sí mismo. Pero al menos puedes escribir la lógica del filtro de forma bastante clara y corta directamente en EditText.
Espero que esto ayude
fuente
Para definir el valor mínimo de EditText, utilicé esto:
fuente
El código de @ Patrik tiene una buena idea pero con muchos errores. @Zac y @Anthony B (soluciones de números negativos) han resuelto algunos de ellos, pero el código de @ Zac todavía tiene 3 errores principales:
1. Si el usuario elimina todas las entradas en EditText, es imposible volver a escribir cualquier número. Por supuesto, esto puede controlarse utilizando un oyente modificado EditText en cada campo, pero borrará la belleza de usar una clase InputFilter común para cada EditText en tu aplicación.
2. Has @ Guernee4 dice que si, por ejemplo, min = 3, es imposible escribir cualquier número que comience con 1.
3. Si, por ejemplo, min = 0, puede escribir tiene muchos ceros que desee, que el resultado no es elegante. O también, si no importa cuál sea el valor mínimo, el usuario puede colocar el cursor en el tamaño izquierdo del primer número, un lugar con un montón de ceros a la izquierda, que tampoco es elegante.
Salí con estos pequeños cambios del código de @ Zac para resolver estos 3 errores. Con respecto al error # 3, todavía no he podido eliminar por completo todos los ceros a la izquierda; Siempre puede ser uno, pero un 00, 01, 0100, etc. en ese caso, es más elegante y válido que un 000000, 001, 000100, etc.etc. Etc.
Aquí está el código:
¡Que tengas un buen día!
fuente
Aquí está mi opinión sobre la respuesta de Pratik Sharma
Kotlin
yDouble
si alguien la necesitafuente