Android esempi di inputFilter

L’EditText in Android è uno dei widget di base usato per l’inserimento dei dati di input. A questo può essere aggiunto un InputFilter per imporre dei vincoli su quali valori possa o non possa accettare. Ad esempio, si vuole imporre il limite di 10 caratteri oppure consentire l’immissione solo dei caratteri maiuscoli.

L’SDK di Android fornisce già un iniseme di filtri di base: Per esempio per i due casi citati si possono usare: AllCaps e LengthFilter. Inoltre , si possono creare dei filtri personalizzati usando l’interfaccia di InputFilter.

Per aggiungere un filtro bisogna chiamare il metodo: setFilters() all’EditText (o in generale a qualsiasi widget editabile).

Vediamo degli esempi di codice:

//Filtro per limitare la lunghezza masssima
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH)});

//Filtro per permettere solo caratteri maiuscoli
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

//Unire più filtri nello stesso EditText
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH * 2), new InputFilter.AllCaps()});

Esempio di inputFilter personalizzato (Range tra Min e Max)

Per creare un filtro personalizzato, è necessario implementare l’interfaccia di InputFilter e sovrascrivere il metodo filter().

  • Il metodo filter() è chiamato quando il buffer deve rimpiazzare la stringa compresa tra inizio e fine (source) con una nuova (dest)
  • restituisce la CharSequence che si vuole avere al posto di quella presente, compresa una stringa vuota se necessario, oppure null per accettare la stringa originaria.
  • sta attento a non buttare le stringhe a lunghezza zero (che si hanno quando cancelli il testo).
  • Fate attenzione perchè non si dovrebbe tentare di apportare modifiche a dest da questo metodo; ; si può esaminare solo per il contesto.

Creiamo un filtro personalizzato per definire valori Min e Max di un range. Tali valori vanno inseriti nel costruttore.

import android.text.InputFilter;
import android.text.Spanned;
 
public class CustomRangeInputFilter implements InputFilter {
    private double minValue;
    private double maxValue;
 
    public CustomRangeInputFilter(double minVal, double maxVal) {
        this.minValue = minVal;
        this.maxValue = maxVal;
    }
 
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dStart, int dEnd) {
        try {
            //Rimuovere la stringa di destinazione che deve essere sostituita
            String newVal = dest.toString().substring(0, dStart) + dest.toString().substring(dEnd, dest.toString().length());
            newVal = newVal.substring(0, dStart) + source.toString() + newVal.substring(dStart, newVal.length());
            double input = Double.parseDouble(newVal);
 
            if (isInRange(minValue, maxValue, input)) {
                return null;
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return "";
    }
 
    private boolean isInRange(double a, double b, double c) {
        return b > a ? c >= a && c <= b : c >= b && c <= a;
    }
}

Per usarlo basta chiamare il metodo setFilter() nell’EditText passandogli un InputFilter creato con il CustomRangeInputFilter (che sarebbe l’oggetto che definisce il filtro creato sopra:

Esempio di Activity

La schermata dell’activity potrebbe comparire come segue:

Esempi inputFilter


Nella schermata come EditText di esempio contenente il Filtro personalizzato (il quarto) si è scelto di inserire ad esempio il numero di dipendenti (tra 1 e 10); in realtà il codice accetta sia numeri interi (che vengono convertiti in automatico) che numeri con la virgola tra i due estremi.
Da notare che l’effetto finale avviene senza segnalazione di errori semplicemente perchè l’inserimento di numeri o caratteri non consentiti non è permesso (per AllCaps i caratteri vengono scritti direttamente in Maiuscolo anche se digitati in minuscolo; per LengthFilter la digitazione si ferma quando viene raggiunto la lunghezza massima consentita e infine per il custom Filter viene accettato solo un numero del range).
//Define Min, Max range value using custom input filter
editText.setFilters(new InputFilter[]{new CustomRangeInputFilter(1.0f, 10.0f)});

File delle stringhe

Di seguito viene anche fornito il file delle stringhe usato nell’esempio:

<resources>
    <string name="app_name">Esempi filtri su Yasb</string>
    <string name="titleFiltri">Profilo Azienda</string>
    <string name="cognomeAllCaps">proprietario (Tutto Maiuscolo)</string>
    <string name="nickMaxLenght">Nickname (max 10 caratteri)</string>
    <string name="company2Filter">Azienda (maiuscolo max 20 caratteri</string>
    <string name="valueInRange">dipendenti (Max 10)</string>
</resources>

Questo articolo è stato liberamente tratto, tradotto, riveduto e ampliato da quello presente su Stacktips.