167 votes

Est-il possible de définir une valeur minimale et maximale pour edittext dans Android?

Je veux définir un min et max de la valeur pour un edittext. Par exemple, si une personne, essayez d'entrer une valeur de mois elle doit être comprise entre 1 et 12 comme vous le savez. Je veux de la limite de cette valeur.

Je peux le faire en utilisant TextWatcher mais je veux savoir, est-il possible de le faire dans le fichier de mise en page ou etc sauf TextWatcher?

Edit: Je ne veux pas de limite de nombre de caractères. Je veux à la limite de la valeur. Par exemple, si je limite le mois edittext w caractères lorsque j'entre 12 il va l'accepter, mais si j'entre 22 il ne faut pas l'accepter et je suis entrée.

Merci à tous. Ce qui concerne.

312voto

Pratik Sharma Points 5230

D'abord faire cette classe:

 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;
    }
}
 

Ensuite, utilisez ceci de votre activité:

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

Cela permettra à l'utilisateur d'entrer des valeurs comprises entre 1 et 12 seulement .

MODIFIER :

Définissez votre edittext avec android:inputType="number" .

Merci.

102voto

Zac Points 509

Il y a une petite erreur dans le code de Pratik. Par exemple, si une valeur est 10 et que vous ajoutez un 1 au début pour obtenir 110, la fonction de filtre traitera la nouvelle valeur comme étant 101.

Voir ci-dessous pour un correctif à ceci:

 @Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        // Remove the string out of destination that is to be replaced
        String newVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend, dest.toString().length());
        // Add the new string in
        newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart, newVal.length());
        int input = Integer.parseInt(newVal);
        if (isInRange(min, max, input))
            return null;
    } catch (NumberFormatException nfe) { }
    return "";
}
 

5voto

AndroidNoob Points 901

J'ai étendu le code de @Pratik Sharmas pour qu'il utilise des objets BigDecimal au lieu d'ints afin qu'il puisse accepter des nombres plus grands et comptabiliser toute mise en forme dans EditText qui n'est pas un nombre (comme la mise en forme monétaire, par exemple, les espaces, les virgules et les points)

 public class InputFilterMinMax implements InputFilter {
private static final int MIN_SIG_FIG = 2;
private BigDecimal min, max;

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

public InputFilterMinMax(String min, String max) {
    this.min = new BigDecimal(min);
    this.max = new BigDecimal(max);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
        int dend) {
    try {
        BigDecimal input = formatStringToBigDecimal(dest.toString()
                + source.toString());

        if (isInRange(min, max, input)) {

            return null;
        }
    } catch (NumberFormatException nfe) {

    }
    return "";
}

private boolean isInRange(BigDecimal a, BigDecimal b, BigDecimal c) {
    return b.compareTo(a) > 0 ? c.compareTo(a) >= 0 && c.compareTo(b) <= 0
            : c.compareTo(b) >= 0 && c.compareTo(a) <= 0;
}

public static BigDecimal formatStringToBigDecimal(String n) {

    Number number = null;
    try {
        number = getDefaultNumberFormat().parse(n.replaceAll("[^\\d]", ""));

        BigDecimal parsed = new BigDecimal(number.doubleValue()).divide(new BigDecimal(100), 2,
                BigDecimal.ROUND_UNNECESSARY);
        return parsed;
    } catch (ParseException e) {
        return new BigDecimal(0);
    }
}

private static NumberFormat getDefaultNumberFormat() {
    NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());
    nf.setMinimumFractionDigits(MIN_SIG_FIG);
    return nf;
}
 

3voto

Argyris Points 1

J'ai fait un moyen plus simple de définir un min / max à un Edittext. J'utilise un clavier arithmétique et je travaille avec cette méthode:

  private int limit(EditText x,int z,int limin,int limax){

    if( x.getText().toString()==null || x.getText().toString().length()==0){
        x.setText(Integer.toString(limin));
        return z=0;
    }
    else{
        z = Integer.parseInt(x.getText().toString());
         if(z <limin || z>limax){
             if(z<10){
                 x.setText(Integer.toString(limin));
                return  z=0;
             }
            else{
                x.setText(Integer.toString(limax));
                return z=limax;
            }

         }
         else
            return z = Integer.parseInt(x.getText().toString());
    }
 }
 

La méthode accepte toutes vos valeurs, mais si une valeur d'utilisateurs ne respecte pas vos limites, elle sera automatiquement définie sur la limite minimale / maximale. Par ex. limit limin = 10, limax = 80 si l'utilisateur définit 8, 10 est automatiquement enregistré dans une variable et EditText est défini sur 10.

1voto

itsrajesh4uguys Points 2309

veuillez vérifier ce code

     String pass = EditText.getText().toString(); 
    if(TextUtils.isEmpty(pass) || pass.length < [YOUR MIN LENGTH]) 
    { 
       EditText.setError("You must have x characters in your txt"); 
        return; 
    }

    //continue processing



edittext.setOnFocusChangeListener( new OnFocusChangeListener() {

       @Override
       public void onFocusChange(View v, boolean hasFocus) {
          if(hasFocus) {
           // USE your code here 
  }
 

Utilisez le lien ci-dessous pour plus de détails sur edittext et le edittextfilteres avec l'observateur de texte.

http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X