Comment puis-je utiliser InputFilter à la limite de caractères dans un EditText dans Android?
Je veux limiter les caractères 0-9, a-z, A-Z et la barre d'espace seulement. Réglage inputtype je peux limiter aux chiffres, mais je ne peux pas comprendre les façons de Inputfilter à la recherche par le biais de la documentation.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ceci sur un autre forum. Fonctionne comme un champion.
InputFilters sont un peu compliqué dans les versions d'Android qui affichent dictionnaire des suggestions. Vous obtenez parfois une SpannableStringBuilder, parfois une simple Chaîne de caractères dans la
source
paramètre.Suivantes InputFilter devrait fonctionner. N'hésitez pas à améliorer ce code!
String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
source instanceof SpannableStringBuilder
, la saisie de AB donne-moi AAB comme lors de la tentative de la réponse précédente. Heureusement, j'ai pu contourner le problème en utilisant @florian solution ci-dessous.beaucoup plus facile:
","
entre les deux. Vous pouvez utiliser quelque chose comme cela"0123456789qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM"
Aucune des réponses n'a fonctionné pour moi. Je suis venu avec mon propre solution:
EditText
pouvez déjà avoir ses propres filtres, par exemple, la longueur du filtre. Donc au lieu de simplement en substituant les filtres, vous avez plus de chances souhaitez ajouter des filtres déjà existants.Utiliser ce son travail à 100% votre besoin et très simple.
Dans strings.xml
Pour éviter les Caractères Spéciaux type d'entrée
Vous pouvez définir un filtre pour votre modifier le texte comme ci-dessous
En plus de la accepté de répondre, il est également possible d'utiliser, par exemple:
android:inputType="textCapCharacters"
comme un attribut de<EditText>
afin de n'accepter que les caractères en majuscules (et le nombre).Pour une raison quelconque, le android.texte.LoginFilter constructeur de la classe est paquet d'étendue, de sorte que vous ne pouvez pas directement l'étendre (même si elle serait identique à ce code). Mais vous pouvez l'étendre LoginFilter.UsernameFilterGeneric! Ensuite vous avez juste ceci:
Ce n'est pas vraiment documenté, mais ça fait partie du noyau de la lib, et la la source est simple. Je l'ai utilisé pendant un certain temps maintenant, jusqu'ici pas de problèmes, mais je dois admettre que je n'ai pas essayé de faire quelque chose de complexe impliquant spannables.
Il est vrai, la meilleure façon d'aller à ce sujet pour le fixer dans le fichier XML de Mise en page elle-même à l'aide de:
comme l'a justement souligné par Florian Fröhlich, il fonctionne bien pour le texte même.
Juste un mot de prudence, les personnages mentionnés dans le
android:digits
ne s'affiche, donc soyez prudent de ne pas manquer un ensemble de caractères out 🙂Cette solution simple a fonctionné pour moi quand j'en avais besoin pour empêcher l'utilisateur d'entrer des chaînes vides dans un EditText. Vous pouvez bien sûr ajouter d'autres caractères:
Si vous sous-classe InputFilter vous pouvez créer votre propre InputFilter qui permettrait de filtrer les non-caractères alpha-numériques.
La InputFilter Interface a une méthode,
filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
, et il vous fournit toutes les informations dont vous avez besoin de savoir sur lequel des caractères ont été saisis dans l'EditText il est assigné.Une fois que vous avez créé votre propre InputFilter, vous pouvez l'affecter à l'EditText en appelant setFilters(...).
http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence, int, int, android.texte.Fractionnés, int, int)
Ignorant la durée de choses que d'autres gens ont de traiter, de gérer correctement dictionnaire des suggestions, j'ai trouvé le code suivant fonctionne.
La source grandit à mesure que la suggestion grandit donc, nous avons à regarder combien de caractères il est en fait ce qui nous attend pour remplacer avant de retourner quoi que ce soit.
Si nous n'avons pas de caractères non valides, de retourner la valeur null de sorte que le défaut de remplacement se produit.
Sinon, nous avons besoin d'extraire les caractères valides à partir de la sous-chaîne qui va vraiment être placé dans l'EditText.
pour prévenir les mots dans l'edittext.
créer une classe que u peut utiliser à tout moment.
C'est un vieux thread, mais le dessein de solutions ont toutes les questions (selon l'appareil /la version d'Android /Clavier).
APPROCHE DIFFÉRENTE
Donc finalement, je suis allé avec une approche différente, au lieu d'utiliser le
InputFilter
problématique de la mise en œuvre, je suis en utilisantTextWatcher
et laTextChangedListener
de laEditText
.CODE COMPLET (EXEMPLE)
La raison
InputFilter
n'est pas une bonne solution dans Android est car il dépend du clavier de mise en œuvre. La saisie au Clavier est filtré avant l'entrée est passée à laEditText
. Mais, parce que certains claviers ont différentes implémentations pour laInputFilter.filter()
invocation, c'est problématique.D'autre part
TextWatcher
ne charge pas sur le clavier de mise en œuvre, il nous permet de créer une solution simple et être sûr que cela fonctionne sur tous les appareils.Il est possible d'utiliser
setOnKeyListener
. Dans cette méthode, nous pouvons personnaliser l'entréeedittext
!si vous souhaitez inclure l'espace blanc dans votre entrée, puis ajouter de l'espace dans android:code à quatre chiffres, comme indiqué ci-dessus.
Il fonctionne très bien pour moi, même dans la version 4.0 d'android.
profiter 🙂