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 EditText
valor 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')});