¿Hay alguna manera de definir un valor mínimo y máximo para EditText en Android?
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 TextWatcher
pero 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 EditText
con caracteres cuando ingreso 12, lo aceptará, pero si ingreso 22, no debe aceptarlo mientras ingreso.
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.
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
}
}
}
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"