Je veux définir une valeur min et max pour un EditText
.
Par exemple: si une personne essaie de saisir une valeur de mois, la valeur doit être comprise entre 1 et 12.
Je peux le faire en utilisant TextWatcher
mais je veux savoir s'il existe un autre moyen de le faire dans un fichier de mise en page ou ailleurs.
Edit: Je ne veux pas limiter le nombre de caractères. Je veux limiter la valeur. Par exemple, si je limite le mois EditText
w caractères lorsque je saisis 12, il l'acceptera, mais si j'entre 22, il ne doit pas l'accepter pendant que j'entre.
android
android-edittext
mertaydin
la source
la source
Réponses:
Commencez par créer ce cours:
Ensuite, utilisez ceci de votre activité:
Cela permettra à l'utilisateur d'entrer des valeurs de 1 à 12 uniquement .
ÉDITER :
Réglez votre edittext avec
android:inputType="number"
.Vous pouvez trouver plus de détails sur https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/ .
Merci.
la source
source
remplaceront certains caractères dansdest
. Je pense que vous devriez simuler le remplacement et obtenir le résultat final, puis le valider.Il y a une petite erreur dans le code de Pratik. Par exemple, si une valeur est 10 et que vous ajoutez un 1 au début pour faire 110, la fonction de filtre traitera la nouvelle valeur comme 101.
Voir ci-dessous pour une solution à cela:
la source
String replacement = source.subSequence(start, end).toString(); String newVal = dest.subSequence(0, dstart).toString() + replacement + dest.subSequence(dend, dest.length()).toString();
String newVal= dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend, dest.toString().length());
, semble plus propre et plus clair.min==3
alors il est impossible de taper un nombre commençant par 1 ou 2 (ex: 15, 23)De ce que j'ai vu de la solution de @ Patrik et de l'ajout de @ Zac, le code fourni a encore un gros problème:
Si
min==3
alors il est impossible de taper un nombre commençant par 1 ou 2 (ex: 15, 23)Si
min>=10
alors il est impossible de taper quoi que ce soit car chaque nombre devra commencer par 1,2,3 ...Dans ma compréhension, nous ne pouvons pas atteindre la limitation min-max de
EditText
la valeur d'un avec une simple utilisation de la classeInputFilterMinMax
, du moins pas pour la valeur min, car lorsque l'utilisateur tape un nombre positif, la valeur augmente et nous pouvons facilement effectuer un test à la volée pour vérifier s'il a atteint la limite ou s'il est sorti de la plage et bloquer les entrées non conformes. Tester la valeur minimale est une autre histoire car nous ne pouvons pas être sûrs si l'utilisateur a fini de taper ou non et ne peut donc pas décider si nous devons bloquer ou non.Ce n'est pas exactement ce que OP a demandé, mais à des fins de validation, j'ai combiné dans ma solution un
InputFilter
pour tester les valeurs maximales, avec unOnFocusChangeListener
pour re-tester la valeur min lorsqueEditText
perd le focus en supposant que l'utilisateur a fini de taper et que c'est quelque chose comme ceci:Et
OnFocusChangeListenerMin
Ensuite, dans Activité, réglez le
InputFilterMax
et leOnFocusChangeListenerMin
àEditText
noter: Vous pouvez 2 à la fois min et max inonFocusChangeListener
.la source
if(Integer.valueOf(val)<min){ //Notify user that the value is not good }
Vous pouvez y faire ce que vous voulez, notifier le utilisateur et définissez EditText sur vide, je ne sais pas si cela répond à votre questionExtension de la réponse de Pratik et Zac. Zac a corrigé un petit bug de Pratik dans sa réponse. Mais j'ai noté que le code ne prend pas en charge les valeurs négatives, il lèvera une NumberFormatException. Pour résoudre ce problème et autoriser le MIN à être négatif, utilisez le code suivant.
Ajoutez cette ligne (en gras) entre les deux autres lignes:
newVal = newVal.substring (0, dstart) + source.toString () + newVal.substring (dstart, newVal.length ());
if (newVal.equalsIgnoreCase ("-") && min <0) return null;
int entrée = Integer.parseInt (newVal);
la source
Si vous avez besoin d'une plage avec des nombres négatifs comme -90: 90, vous pouvez utiliser cette solution.
la source
J'ai étendu le code @Pratik Sharmas pour utiliser des objets BigDecimal au lieu de ints afin qu'il puisse accepter des nombres plus grands et tenir compte de tout formatage dans EditText qui n'est pas un nombre (comme le formatage des devises, c'est-à-dire des espaces, des virgules et des points)
EDIT: notez que cette implémentation a 2 comme chiffres significatifs minimum définis sur le BigDecimal (voir la constante MIN_SIG_FIG) car je l'ai utilisé pour la devise, il y avait donc toujours 2 nombres en tête avant le point décimal. Modifiez la constante MIN_SIG_FIG si nécessaire pour votre propre implémentation.
la source
J'ai trouvé ma propre réponse. Il est très tard maintenant mais je veux le partager avec vous. J'implémente cette interface:
Et puis implémentez-le de cette manière dans votre activité:
C'est une réponse très simple, s'il vous plaît, dites-moi.
la source
Il y a quelque chose qui ne va pas dans la réponse acceptée.
Si je déplace le curseur au milieu du texte, puis tapez quelque chose, l'instruction ci-dessus produira un résultat erroné. Par exemple, tapez d'abord «12», puis tapez «0» entre 1 et 2, puis l'instruction mentionnée ci-dessus produira «120» au lieu de 102. J'ai modifié cette instruction en instructions ci-dessous:
la source
Kotlin si quelqu'un en a besoin (utiliser des utilitaires)
Ensuite, utilisez ceci de votre classe Kotlin
Cet EditText permet de 1 à 100.
Ensuite, utilisez ceci à partir de votre XML
la source
J'ai fait un moyen plus simple de définir un min / max sur un Edittext. J'utilise le clavier arithmétique et je travaille avec cette méthode:
La méthode accepte toutes vos valeurs, mais si une valeur d'utilisateurs ne respecte pas vos limites, elle sera automatiquement définie sur la limite min / max. Par ex. limit limin = 10, limax = 80 si l'utilisateur définit 8, automatiquement 10 est enregistré dans une variable et EditText est défini sur 10.
la source
Je sais qu'il y a déjà un million de réponses à cela, dont une acceptée. Cependant, il existe de nombreux bogues dans la réponse acceptée et la plupart des autres en corrigent simplement un (ou peut-être deux), sans s'étendre à tous les cas d'utilisation possibles.
J'ai donc compilé la plupart des corrections de bogues suggérées dans les réponses de support ainsi que l'ajout d'une méthode pour permettre l'entrée continue de nombres en dehors de la plage dans la direction de 0 (si la plage ne commence pas à 0), du moins jusqu'à ce qu'elle soit certain qu'il ne peut plus être dans la plage. Parce que pour être clair, c'est le seul moment qui cause vraiment des problèmes avec de nombreuses autres solutions.
Voici la solution:
Notez que certains cas de saisie sont impossibles à gérer "activement" (c'est-à-dire lorsque l'utilisateur le saisit), nous devons donc les ignorer et les gérer une fois que l'utilisateur a fini de modifier le texte.
Voici comment vous pourriez l'utiliser:
Maintenant, lorsque l'utilisateur essaie de taper un nombre plus proche de 0 que la plage le permet, l'une des deux choses suivantes se produit:
Si
min
etmax
ont le même nombre de chiffres, ils ne seront pas autorisés à le saisir du tout une fois qu'ils auront atteint le dernier chiffre.Si un nombre en dehors de la plage est laissé dans le champ lorsque le texte perd le focus, il sera automatiquement ajusté à la limite la plus proche.
Et bien sûr, l'utilisateur ne sera jamais autorisé à entrer une valeur plus éloignée de 0 que la plage le permet, et il n'est pas non plus possible pour un nombre comme celui-là d'être "accidentellement" dans le champ de texte pour cette raison.
Problèmes connus?)
EditText
perd le focus lorsque l'utilisateur en a terminé avec lui.L'autre option consiste à nettoyer lorsque l'utilisateur appuie sur la touche «terminé» / retour, mais dans de nombreux cas, voire dans la plupart des cas, cela provoque de toute façon une perte de concentration.
Cependant, la fermeture du clavier virtuel ne désactive pas automatiquement la mise au point de l'élément. Je suis sûr que 99,99% des développeurs Android le souhaiteraient (et cette concentration sur la gestion des
EditText
éléments était moins un bourbier en général), mais pour l'instant, il n'y a pas de fonctionnalité intégrée pour cela. La méthode la plus simple que j'ai trouvée pour contourner ce problème, si vous en avez besoin, est d'étendreEditText
quelque chose comme ceci:Cela "trompera" le filtre en nettoyant l'entrée même si la vue n'a pas réellement perdu le focus. Si la vue perd par la suite le focus d'elle-même, l'assainissement d'entrée se déclenchera à nouveau, mais rien ne changera car il a déjà été corrigé.
Fermeture
Ouf. C'était beaucoup. Ce qui semblait à l'origine être un problème assez trivial a fini par découvrir de nombreux petits morceaux laids d'Android vanille (du moins en Java). Et encore une fois, il vous suffit d'ajouter l'écouteur et de l'étendre
EditText
si votre plage n'inclut pas 0 d'une manière ou d'une autre. (Et de manière réaliste, si votre plage n'inclut pas 0 mais commence à 1 ou -1, vous ne rencontrerez pas non plus de problèmes.)En dernier lieu, cela ne fonctionne que pour les ints . Il existe certainement un moyen de l'implémenter pour travailler avec des décimales (
double
,float
), mais comme ni moi ni le demandeur d'origine n'en avons besoin, je ne veux pas particulièrement approfondir tout cela. Il serait très facile d'utiliser simplement le filtrage post-achèvement avec les lignes suivantes:Il vous suffirait de changer de
int
àfloat
(oudouble
), d'autoriser l'insertion d'un seul.
(ou,
, selon le pays?), Et d'analyser comme l'un des types décimaux au lieu d'unint
.Cela gère la plupart du travail de toute façon, donc cela fonctionnerait de manière très similaire.
la source
la source
Exemple très simple sur Kotlin:
la source
veuillez vérifier ce code
Utilisez le lien ci-dessous pour plus de détails sur edittext et les edittextfilteres avec text watcher.
http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/
la source
Si vous n'êtes préoccupé que par la limite maximale, ajoutez simplement la ligne ci-dessous dans
Si vous avez besoin d'ajouter une limite minimale, vous pouvez faire comme ceci dans ce cas, la limite minimale est de 7. l'utilisateur est limité à entrer un caractère entre la limite min et max (entre 8 et 10)
Si vous devez également restreindre l'utilisateur à entrer 01 au début, modifiez si la condition comme ceci
À la fin de la méthode d'appel comme
la source
@Pratik Sharma
Pour prendre en charge les nombres négatifs , ajoutez le code suivant dans la méthode de filtrage :
Ensuite, utilisez ceci de votre activité:
Réglez votre edittext avec:
la source
// a encore un problème mais ici vous pouvez utiliser min, max à n'importe quelle plage (positive ou négative)
la source
Pour ajouter à la réponse de Pratik, voici une version modifiée où l'utilisateur peut également saisir au moins 2 chiffres, par exemple 15 à 100:
J'espère que cela t'aides. veuillez ne pas voter sans raison.
la source
voici la façon dont j'ai utilisé, ça marche pour un nombre négatif
Tout d'abord, créez la classe MinMaxFIlter.java avec le code suivant:
Ensuite, créez et définissez votre filtre sur votre edittext comme ceci:
la source
c'est mon code max = 100, min = 0
xml
Java
la source
Vous pouvez le faire avec un InputFilter. Apparemment, il n'y a que cette interface de filtre d'entrée que vous pouvez utiliser. Avant de le faire de manière ennuyeuse et de créer une nouvelle classe qui étend le filtre d'entrée, vous pouvez utiliser ce raccourci avec une instanciation d'interface de classe interne.
Par conséquent, faites simplement ceci:
Dans cet exemple, je vérifie si la valeur de EditText est supérieure à 8. Sinon, elle doit être mise à 8. Donc, apparemment, vous devez régler vous-même le min max ou n'importe quelle logique de filtre. Mais au moins, vous pouvez écrire la logique du filtre assez nette et courte directement dans le EditText.
J'espère que cela t'aides
la source
Pour définir la valeur minimale du EditText, j'ai utilisé ceci:
la source
Le code de @ Patrik a une bonne idée mais avec beaucoup de bugs. @Zac et @Anthony B (solutions de nombres négatifs) ont résolu certains d'entre eux, mais le code de @ Zac a encore 3 bugs majeurs:
1. Si l'utilisateur supprime toutes les entrées dans EditText, il est impossible de taper à nouveau un nombre. Bien sûr, cela peut être contrôlé en utilisant un écouteur modifié EditText sur chaque champ, mais cela effacera la beauté d'utiliser une classe InputFilter commune pour chaque EditText dans votre application.
2. A @ Guernee4 dit, si par exemple min = 3, il est impossible de taper un nombre commençant par 1.
3. Si par exemple min = 0, vous pouvez taper a beaucoup de zéros que vous souhaitez, que le résultat n'est pas élégant. Ou aussi, si quelle que soit la valeur minimale, l'utilisateur peut placer le curseur dans la taille gauche du premier nombre, et placer un tas de zéros non significatifs vers la gauche, également pas élégant.
Je suis venu avec ces petits changements du code de @ Zac pour résoudre ces 3 bogues. En ce qui concerne le bug n ° 3, je n'ai toujours pas pu supprimer complètement tous les zéros de gauche à gauche; Cela peut toujours être un, mais un 00, 01, 0100, etc. dans ce cas, est plus élégant et valide qu'un 000000, 001, 000100, etc. etc. Etc.
Voici le code:
Bonne journée!
la source
Voici mon avis sur la réponse de Pratik Sharma
Kotlin
etDouble
si quelqu'un en a besoinla source