Saltar al contenido

¿Hay alguna manera de definir un valor mínimo y máximo para EditText en Android?

Solución:

Primero haz esta clase:

package com.test;

import android.text.InputFilter;
import android.text.Spanned;

public class InputFilterMinMax implements InputFilter {

    private int min, max;

    public InputFilterMinMax(int min, int max) {
        this.min = min;
        this.max = max;
    }

    public InputFilterMinMax(String min, String max) {
        this.min = Integer.parseInt(min);
        this.max = Integer.parseInt(max);
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {   
        try {
            int input = Integer.parseInt(dest.toString() + source.toString());
            if (isInRange(min, max, input))
                return null;
        } catch (NumberFormatException nfe) { }     
        return "";
    }

    private boolean isInRange(int a, int b, int c) {
        return b > a ? c >= a && c <= b : c >= b && c <= a;
    }
}

Luego usa esto de tu Actividad:

EditText et = (EditText) findViewById(R.id.myEditText);
et.setFilters(new InputFilter[]{ new InputFilterMinMax("1", "12")});

Esto permitirá al usuario ingresar valores de 1 a 12 solamente.

EDITAR:

Configure 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.

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ía el nuevo valor como 101.

Vea a continuación una solución a esto:

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        // Removes string that is to be replaced from destination
        // and adds the new string in.
        String newVal = dest.subSequence(0, dstart)
                // Note that below "toString()" is the only required:
                + source.subSequence(start, end).toString()
                + dest.subSequence(dend, dest.length());
        int input = Integer.parseInt(newVal);
        if (isInRange(min, max, input))
            return null;
    } catch (NumberFormatException nfe) { }
    return "";
}

De lo que he visto de la solución de @ Patrik y la adición de @ Zac, el código proporcionado todavía tiene un gran problema:

Si min==3 entonces es imposible escribir cualquier número que comience con 1 o 2 (ej: 15, 23)
Si min>=10 entonces es imposible escribir nada ya que cada número tendrá que comenzar con 1,2,3 …

A mi entender, no podemos lograr la limitación mínima-máxima de un EditTextvalor con el uso simple de la clase InputFilterMinMax, al menos no para el valor mínimo, porque cuando el usuario escribe un número positivo, el valor aumenta y podemos realizar fácilmente una prueba sobre la marcha para verificar si se alcanzó el límite o se salió del rango y bloquear las entradas que no cumpla. 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, he combinado en mi solución un InputFilter para probar los valores máximos, con un OnFocusChangeListener para volver a probar el valor mínimo cuando el EditText pierde el foco asumiendo que el usuario terminó de escribir y es algo como esto:

package test;


import android.text.InputFilter;

import android.text.Spanned;

public class InputFilterMax implements InputFilter {

private int max;

public InputFilterMax(int max) {
    this.max = max;
}

public InputFilterMax(String max) {
    this.max = Integer.parseInt(max);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {   
    try {
        String replacement = source.subSequence(start, end).toString(); 

        String newVal = dest.toString().substring(0, dstart) + replacement +dest.toString().substring(dend, dest.toString().length());

        int input = Integer.parseInt(newVal);

        if (input<=max)
            return null;
    } catch (NumberFormatException nfe) { }   
//Maybe notify user that the value is not good      
return "";
}
}

Y OnFocusChangeListenerMin

package test;

import android.text.TextUtils;
import android.view.View;
import android.view.View.OnFocusChangeListener;

public class OnFocusChangeListenerMin implements OnFocusChangeListener {

private int min;

public OnFocusChangeListenerMin(int min) {
    this.min = min;
}

public OnFocusChangeListenerMin(String min) {
    this.min = Integer.parseInt(min);
}


@Override
public void onFocusChange(View v, boolean hasFocus) {
    if(!hasFocus) {
        String val = ((EditText)v).getText().toString();
        if(!TextUtils.isEmpty(val)){
            if(Integer.valueOf(val)<min){
                //Notify user that the value is not good
            }

        }
    }
}
}

Luego, en Actividad, configure el InputFilterMax y elOnFocusChangeListenerMin para EditText
nota: Puede 2 tanto mínimo como máximo en onFocusChangeListener.

mQteEditText.setOnFocusChangeListener( new OnFocusChangeListenerMin('20');
mQteEditText.setFilters(new InputFilter[]{new InputFilterMax(getActivity(),'50')});
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *