Je veux limiter les caractères à 0-9, az, AZ et barre d'espace uniquement. Définition du type d'entrée Je peux me limiter aux chiffres, mais je ne peux pas comprendre les façons dont Inputfilter regarde à travers les documents.
android
android-edittext
Tim Wayne
la source
la source
InputFilter
Les versions d'Android qui affichent des suggestions de dictionnaires sont un peu compliquées. Vous obtenez parfois unSpannableStringBuilder
, parfois un simpleString
dans lesource
paramètre.Ce qui suit
InputFilter
devrait fonctionner. N'hésitez pas à améliorer ce code!la source
String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
source instanceof SpannableStringBuilder
entrer AB me donne AAB comme lorsque j'essaye la réponse précédente. Heureusement, j'ai pu contourner ce problème en utilisant la solution @florian ci-dessous.beaucoup plus facile:
la source
","
entre les deux. Vous pouvez utiliser quelque chose comme ça"0123456789qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM"
imeOptions="actionNext"
, etc.Aucune des réponses publiées n'a fonctionné pour moi. Je suis venu avec ma propre solution:
la source
EditText
peut déjà avoir ses propres filtres, par exemple un filtre de longueur. Ainsi, au lieu de simplement remplacer les filtres, vous souhaiterez probablement ajouter vos filtres à ceux déjà existants.Utilisez ce travail à 100% selon vos besoins et très simple.
Dans strings.xml
la source
Pour éviter les caractères spéciaux dans le type d'entrée
Vous pouvez définir un filtre sur votre texte d'édition comme ci-dessous
la source
En plus de la réponse acceptée, il est également possible d'utiliser par exemple:
android:inputType="textCapCharacters"
comme attribut de<EditText>
pour n'accepter que les majuscules (et les nombres).la source
Pour une raison quelconque, le constructeur de la classe android.text.LoginFilter a une portée globale, vous ne pouvez donc pas l'étendre directement (même s'il serait identique à ce code). Mais vous pouvez étendre LoginFilter.UsernameFilterGeneric! Ensuite, vous avez juste ceci:
Ce n'est pas vraiment documenté, mais cela fait partie de la bibliothèque principale, et la source est simple . Je l'utilise depuis un moment maintenant, jusqu'à présent aucun problème, même si j'avoue que je n'ai pas essayé de faire quelque chose de complexe impliquant des spannables.
la source
C'est vrai, la meilleure façon de procéder pour le corriger dans la mise en page XML elle-même en utilisant:
comme l'a justement souligné Florian Fröhlich, cela fonctionne bien pour les vues de texte même.
Juste un mot d'avertissement, les caractères mentionnés dans le
android:digits
seront uniquement affichés, alors faites attention à ne manquer aucun jeu de caractères :)la source
inputType
cela n'affecte pas le filtrage.Cette solution simple a fonctionné pour moi lorsque je devais empêcher l'utilisateur d'entrer des chaînes vides dans un EditText. Vous pouvez bien sûr ajouter plus de caractères:
la source
Si vous sous-classez InputFilter, vous pouvez créer votre propre InputFilter qui filtrerait tous les caractères non alphanumériques.
L'interface InputFilter a une méthode,
filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
et elle vous fournit toutes les informations dont vous avez besoin pour savoir quels caractères ont été entrés dans le EditText auquel il est affecté.Une fois que vous avez créé votre propre InputFilter, vous pouvez l'attribuer à EditText en appelant setFilters (...).
http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence , int, int, android.text.Spanned, int, int)
la source
En ignorant les problèmes de span que d'autres personnes ont traités, pour gérer correctement les suggestions de dictionnaire, j'ai trouvé que le code suivant fonctionne.
La source grandit au fur et à mesure que la suggestion grandit, nous devons donc examiner le nombre de caractères que nous attendons réellement de nous remplacer avant de retourner quoi que ce soit.
Si nous n'avons pas de caractères non valides, retournez null pour que le remplacement par défaut se produise.
Sinon, nous devons extraire les caractères valides de la sous-chaîne qui va VRAIMENT être placée dans EditText.
la source
pour empêcher les mots dans edittext. créez une classe que vous pourriez utiliser à tout moment.
la source
Ajoutez d'abord dans
strings.xml
:XML :
Code en Kotlin:
Étrange, mais cela fonctionne bizarrement sur le clavier virtuel de l'émulateur.
Avertissement! Le code suivant filtrera toutes les lettres et autres symboles à l'exception des chiffres des claviers logiciels. Seul le clavier numérique apparaîtra sur les smartphones.
Je habituellement également mis
maxLength
,filters
,inputType
.la source
Il s'agit d'un ancien fil de discussion, mais les solutions proposées ont toutes des problèmes (selon l'appareil / la version Android / le clavier).
UNE APPROCHE DIFFÉRENTE
Donc, finalement, je suis allé avec une approche différente, au lieu d'utiliser l'
InputFilter
implémentation problématique, j'utiliseTextWatcher
etTextChangedListener
leEditText
.CODE COMPLET (EXEMPLE)
La raison
InputFilter
n'est pas une bonne solution sous Android car cela dépend de l'implémentation du clavier. L'entrée Clavier est filtrée avant que l'entrée ne soit transmise auEditText
. Mais, comme certains claviers ont des implémentations différentes pour l'InputFilter.filter()
invocation, cela est problématique.D'autre part,
TextWatcher
ne se soucie pas de l'implémentation du clavier, cela nous permet de créer une solution simple et d'être sûr qu'elle fonctionnera sur tous les appareils.la source
onTextChanged
simplement besoin d'unpublic void
devant lui.J'ai fait quelque chose comme ça pour rester simple:
De cette façon, nous remplaçons tous les caractères indésirables dans la nouvelle partie de la chaîne source par une chaîne vide.
La
edit_text
variable est l'EditText
objet auquel nous nous référons.Le code est écrit
kotlin
.la source
Il est possible d'utiliser
setOnKeyListener
. Dans cette méthode, nous pouvons personnaliser l'entréeedittext
!la source
C'est ainsi que j'ai créé un filtre pour le champ Nom dans Modifier le texte (la première lettre est MAJUSCULES et n'autorise qu'un seul espace après chaque mot.
la source
J'ai la même réponse à Kotlin:
et récupérez la classe avec une fonction d'extension:
la source