Comment restreindre le EditText pour accepter uniquement les caractères alphanumériques

Comment puis-je restreindre un EditText pour n’accepter que les caractères alphanumériques, les caractères minuscules et majuscules EditText en majuscules dans EditText ?

    

Si un utilisateur tape “abcd” en minuscule, le EditText devrait afficher automatiquement “ABCD” en majuscule sans avoir à restreindre le clavier aux majuscules.

Dans le XML, ajoutez ceci:

  android:digits="abcdefghijklmnopqrstuvwxyz1234567890 " 

Comment restreindre le texte EditText pour qu’il accepte uniquement les caractères alphanumériques, de sorte que quelque soit la majuscule ou la minuscule que l’utilisateur est en train de taper, EditText affichera les majuscules

La solution InputFilter fonctionne bien et vous offre un contrôle total pour filtrer les entrées à un niveau de grain plus fin que android:digits . La méthode filter() doit retourner la valeur null si tous les caractères sont valides ou une valeur CharSequence des caractères valides uniquement 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 SsortingngBuilder builder = new SsortingngBuilder(); 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 plus, lors de la configuration de votre InputFilter , vous devez vous assurer de ne pas écraser les autres InputFilters définis 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à, de sorte que notre filtre alphanumérique conserve tout le texte alphanumérique et le convertit en majuscules.

  // Apply the filters to control the input (alphanumeric) ArrayList curInputFilters = new ArrayList(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); 

Si vous ne voulez pas beaucoup de personnalisation, un simple truc est en fait celui ci-dessus avec tous les caractères que vous voulez append dans Android: chiffres

 android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" 

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

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.

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.toSsortingng().matches("[a-zA-Z 0-9]+")){ return src; } return ""; } } }); } 

Vous ne voulez écrire aucune expression régulière, vous pouvez simplement append des propriétés XML à votre texte d’édition.

 android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" android:inputType="textCapCharacters" 

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

Cela fonctionne pour moi:

android:inputType="textVisiblePassword"

Pour cela, vous devez créer votre filtre personnalisé et définir sur votre EditText comme ceci.

Cela convertira automatiquement vos alphabets en majuscules.

 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.

Faites par programme 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 ssortingng return ""; } return null; } }, new InputFilter.AllCaps() }); 

Notez que l’appel à setInputType est nécessaire pour être sûr que la variable d’ 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 aviez activé les parameters de période rapide (Tap space bar twice for period followed by space) . Avec ce paramètre, il supprime un caractère de votre texte d’entrée. Ce code résout également ce problème.

une ligne réponse

XML Ajoutez ceci textAllCaps = “true”

Faites ceci surCréer ()

pour les minuscules et les majuscules en laissant de l’espace

 yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 ")); 

pour les minuscules avec espace autorisé (réponse obligatoire pour cette question)

 yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 ")); 

pour les majuscules avec espace disponible

 yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "));