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.
Dans le XML, ajoutez ceci:
Android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
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);
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.
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.toString().matches("[a-zA-Z 0-9]+")){
return src;
}
return "";
}
}
});
}
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.
Approche minimaliste de Kotlin:
fun EditText.allowOnlyAlphaNumericCharacters() {
filters = filters.plus(
listOf(
InputFilter { s, _, _, _, _, _->
s.replace(Regex("[^A-Za-z0-9]"), "")
},
InputFilter.AllCaps()
)
)
}
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.
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.
Cela fonctionne pour moi:
Android:inputType="textVisiblePassword"
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="PromoCode"
Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
Android:inputType="text" />