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:
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.