web-dev-qa-db-fra.com

Comment restreindre l'EditText pour n'accepter que les caractères alphanumériques

Comment puis-je restreindre une EditText à n'accepter que les caractères alphanumériques, les caractères minuscules et majuscules apparaissant en majuscules dans la EditText?

<EditText
    Android:id="@+id/userInput"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:inputType="textMultiLine"
    Android:minLines="3" >

    <requestFocus />
</EditText>

Si un utilisateur tape en minuscule "abcd", la EditText devrait automatiquement afficher la majuscule "ABCD" sans qu'il soit nécessaire de limiter le clavier à la majuscule.

48
user3472001

Dans le XML, ajoutez ceci:

 Android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
106
Hashir Sheikh

Comment limiter le EditText à n'accepter que des caractères alphanumériques afin que, quelle que soit la touche minuscule ou majuscule saisie par l'utilisateur, EditText affichera des majuscules

La solution InputFilter fonctionne bien et vous donne le plein contrôle pour filtrer les entrées à un niveau de grain plus fin que Android:digits. La méthode filter() doit renvoyer null si tous les caractères sont valides, ou une CharSequence composée uniquement des caractères valides si certains caractères ne sont pas valides. Si plusieurs caractères sont copiés et collés, et que certains ne sont pas valides, seuls les caractères valides doivent être conservés. 

public static class AlphaNumericInputFilter implements InputFilter {
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {

        // Only keep characters that are alphanumeric
        StringBuilder builder = new StringBuilder();
        for (int i = start; i < end; i++) {
            char c = source.charAt(i);
            if (Character.isLetterOrDigit(c)) {
                builder.append(c);
            }
        }

        // If all characters are valid, return null, otherwise only return the filtered characters
        boolean allCharactersValid = (builder.length() == end - start);
        return allCharactersValid ? null : builder.toString();
    }
}

De même, lorsque vous définissez votre InputFilter, vous devez vous assurer de ne pas écraser un autre InputFilters défini sur votre EditText; ceux-ci pourraient être définis en XML, comme Android:maxLength. Vous devez également tenir compte de l'ordre dans lequel les InputFilters sont définis, ils sont appliqués dans cet ordre. Heureusement, InputFilter.AllCaps existe déjà, donc appliquer avec notre filtre alphanumérique conservera tout le texte alphanumérique et le convertira en majuscule.

    // Apply the filters to control the input (alphanumeric)
    ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(editText.getFilters()));
    curInputFilters.add(0, new AlphaNumericInputFilter());
    curInputFilters.add(1, new InputFilter.AllCaps());
    InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]);
    editText.setFilters(newInputFilters);
20
Steven Byle

Si vous ne voulez pas trop de personnalisation, une astuce consiste en ce que celle-ci contient tous les caractères à ajouter dans Android: chiffres

Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

Cela devrait fonctionner pour accepter les valeurs alphanumériques en majuscules et minuscules.

9
Ajeet Singh

Utilisez ceci:

Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Android:inputType="textCapCharacters"

J'ai essayé d'utiliser textAllCaps="true" comme suggéré dans un commentaire de réponse acceptée à cette question mais cela n'a pas fonctionné comme prévu.

8
thetanuj

essaye ça:

private void addFilterToUserName()
    {

        sign_up_display_name_et.setFilters(new InputFilter[] {
                new InputFilter() {
                    public CharSequence filter(CharSequence src, int start,
                                               int end, Spanned dst, int dstart, int dend) {
                        if(src.equals("")){ // for backspace
                            return src;
                        }
                        if(src.toString().matches("[a-zA-Z 0-9]+")){
                            return src;
                        }
                        return "";
                    }
                }
        });
    }
4
Gal Rom

Vous ne voulez pas écrire d'expression régulière pour cela, vous pouvez simplement ajouter des propriétés XML à votre texte d'édition

Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
Android:inputType="textCapCharacters"

Testé fonctionnant parfaitement pour la validation de la carte PAN.

2
saigopi

Approche minimaliste de Kotlin:

fun EditText.allowOnlyAlphaNumericCharacters() {
    filters = filters.plus(
        listOf(
            InputFilter { s, _, _, _, _, _->
                s.replace(Regex("[^A-Za-z0-9]"), "")
            },
            InputFilter.AllCaps()
        )
    )
}
2
methodsignature

Pour cela, vous devez créer votre filtre personnalisé et définir votre texte d'édition comme ceci.

Cela convertira vos alphabets en majuscules automatiquement. 

EditText editText = (EditText)findViewById(R.id.userInput);
InputFilter myFilter = new InputFilter() {

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        try {
            Character c = source.charAt(0);
            if (Character.isLetter(c) || Character.isDigit(c)) {
                return "" + Character.toUpperCase(c);
            } else {
                return "";
            }
        } catch (Exception e) {
        }
        return null;
    }
};
editText.setFilters(new InputFilter[] { myFilter });

Aucun paramètre supplémentaire à définir dans le fichier XML. 

1
Biraj Zalavadia

Par programme, faites ceci:

mEditText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
mEditText.setFilters(new InputFilter[] {
    new InputFilter() {   
        @Override  
        public CharSequence filter(CharSequence input, int start, int end, Spanned dst, int dstart, int dend) { 
            if (input.length() > 0 && !Character.isLetterOrDigit(input.charAt(0))) {  
                // if not alphanumeric, disregard the latest input
                // by returning an empty string 
                return ""; 
            }
            return null;
        }  
    }, new InputFilter.AllCaps()
});

Notez que l'appel à setInputType est nécessaire pour que nous soyons sûrs que la variable input est toujours le dernier caractère donné par l'utilisateur.

J'ai essayé d'autres solutions discutées ici dans SO. Mais beaucoup d'entre eux se comportaient bizarrement dans certains cas, par exemple lorsque vous avez activé les paramètres Quick Period (Tap space bar twice for period followed by space). Avec ce paramètre, il supprime un caractère de votre texte de saisie. Ce code résout également ce problème. 

1
user1506104

Cela fonctionne pour moi:

Android:inputType="textVisiblePassword"

1
edwardaa
<EditText
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:hint="PromoCode"
                    Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
                    Android:inputType="text" />
0
Amir De