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

Resuelto mertaydin asked hace 54 años • 30 respuestas

Quiero definir un valor mínimo y máximo para un archivo EditText.

Por ejemplo: si alguna persona intenta ingresar un valor de mes, el valor debe estar entre 1 y 12.

Puedo hacerlo usando TextWatcherpero quiero saber si hay alguna otra forma de hacerlo en un archivo de diseño o en otro lugar.

Editar: no quiero limitar el número de caracteres. Quiero limitar el valor. Por ejemplo, si limito el mes EditTextcon caracteres cuando ingreso 12, lo aceptará, pero si ingreso 22, no debe aceptarlo mientras ingreso.

mertaydin avatar Jan 01 '70 08:01 mertaydin
Aceptado

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 desde tu Actividad:

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

Esto permitirá al usuario ingresar valores del 1 al 12 únicamente .

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.

Pratik Sharma avatar Jan 08 '2013 10:01 Pratik Sharma

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 obtener 110, la función de filtro tratará 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 "";
}

ACTUALIZAR

Versión Kotlin

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

/**
 * Custom InputFilter that restricts the input to a range of minimum and maximum values, both
 * inclusive. The edit text must have android:inputType="number".
 */
class MinMaxEditTextInputFilter(private val mMin: Int, private val mMax: Int) : InputFilter {

  override fun filter(
    source: CharSequence,
    start: Int,
    end: Int,
    dest: Spanned,
    dstart: Int,
    dend: Int,
  ): CharSequence {
    try {
      val newValueString: String = dest.subSequence(0, dstart).toString() +
        source.subSequence(start, end).toString() +
        dest.subSequence(dend, dest.length)
      val newValueInt = newValueString.toInt()
      if (isInRange(mMin, mMax, newValueInt)) return source
    } catch (e: NumberFormatException) {
      e.printStackTrace()
    }
    return ""
  }

  private fun isInRange(min: Int, max: Int, value: Int): Boolean {
    return if (max > min) {
      value in min..max
    } else {
      value in max..min
    }
  }
}
Zac avatar Sep 28 '2013 22:09 Zac

Kotlin si alguien lo necesita (Usar utilidades)

class InputFilterMinMax: InputFilter {
    private var min:Int = 0
    private var max:Int = 0
    constructor(min:Int, max:Int) {
        this.min = min
        this.max = max
    }
    constructor(min:String, max:String) {
        this.min = Integer.parseInt(min)
        this.max = Integer.parseInt(max)
    }
    override fun filter(source:CharSequence, start:Int, end:Int, dest: Spanned, dstart:Int, dend:Int): CharSequence? {
        try
        {
            val input = Integer.parseInt(dest.toString() + source.toString())
            if (isInRange(min, max, input))
                return null
        }
        catch (nfe:NumberFormatException) {}
        return ""
    }
    private fun isInRange(a:Int, b:Int, c:Int):Boolean {
        return if (b > a) c in a..b else c in b..a
    }
}

Luego usa esto de tu clase de Kotlin

percentage_edit_text.filters = arrayOf(Utilities.InputFilterMinMax(1, 100))

Este EditText permite de 1 a 100.

Luego usa esto desde tu XML

android:inputType="number"
Alish avatar Nov 27 '2019 10:11 Alish