Ich möchte einen Min- und Max-Wert für ein definieren EditText
.
Beispiel: Wenn eine Person versucht, einen Monatswert einzugeben, muss der Wert zwischen 1 und 12 liegen.
Ich kann es mit verwenden, TextWatcher
aber ich möchte wissen, ob es eine andere Möglichkeit gibt, dies in der Layoutdatei oder anderswo zu tun.
Bearbeiten: Ich möchte die Anzahl der Zeichen nicht begrenzen. Ich möchte den Wert begrenzen. Wenn ich beispielsweise EditText
bei der Eingabe von 12 Zeichen für Monat w beschränke , wird dies akzeptiert. Wenn ich jedoch 22 Zeichen eingebe, darf dies bei der Eingabe nicht akzeptiert werden.
android
android-edittext
mertaydin
quelle
quelle
Antworten:
Machen Sie zuerst diese Klasse:
Verwenden Sie dann dies aus Ihrer Aktivität:
Dadurch kann der Benutzer nur Werte von 1 bis 12 eingeben .
EDIT:
Stellen Sie Ihren Edittext mit ein
android:inputType="number"
.Weitere Informationen finden Sie unter https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/ .
Vielen Dank.
quelle
source
ersetzen einige Zeichen indest
. Ich denke, Sie sollten den Austausch simulieren und das Endergebnis erhalten und es dann validieren.Es gibt einen kleinen Fehler in Pratiks Code. Wenn beispielsweise ein Wert 10 ist und Sie zu Beginn eine 1 hinzufügen, um 110 zu erhalten, behandelt die Filterfunktion den neuen Wert als 101.
Eine Lösung hierfür finden Sie weiter unten:
quelle
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());
, sieht sauberer und klarer aus.min==3
dann unmöglich ist, eine Zahl einzugeben, die mit 1 oder 2 beginnt (Beispiel: 15, 23)Von dem, was ich von @ Patriks Lösung und @ Zacs Hinzufügung gesehen habe, hat der bereitgestellte Code immer noch ein großes Problem:
Wenn es
min==3
dann unmöglich ist, eine Zahl einzugeben, die mit 1 oder 2 beginnt (Beispiel: 15, 23).Wenn es
min>=10
dann unmöglich ist, etwas einzugeben, da jede Zahl mit 1,2,3 beginnen muss ...Nach meinem Verständnis können wir die Min-Max-Begrenzung des
EditText
Werts von a nicht durch einfache Verwendung der Klasse erreichenInputFilterMinMax
, zumindest nicht für den Min-Wert, da der Wert wächst, wenn der Benutzer eine positive Zahl eingibt, und wir leicht eine ausführen können On-the-Fly-Test, um zu überprüfen, ob das Limit erreicht wurde oder außerhalb des Bereichs liegt, und Einträge zu blockieren, die nicht den Anforderungen entsprechen. Das Testen des Mindestwerts ist eine andere Geschichte, da wir nicht sicher sein können, ob der Benutzer die Eingabe beendet hat oder nicht, und daher nicht entscheiden können, ob wir blockieren sollen oder nicht.Es ist nicht genau das, was OP angefordert hat, aber zu Validierungszwecken habe ich in meiner Lösung kombiniert
InputFilter
,OnFocusChangeListener
um Maximalwerte zu testen, mit einem erneuten Test für Minimalwerte, wennEditText
der Fokus verloren geht, vorausgesetzt, der Benutzer hat die Eingabe beendet und es ist ungefähr so:Und
OnFocusChangeListenerMin
Stellen Sie dann in Aktivität das
InputFilterMax
und dasOnFocusChangeListenerMin
zuEditText
beachtende ein: Sie können 2 sowohl min als auch max inonFocusChangeListener
.quelle
if(Integer.valueOf(val)<min){ //Notify user that the value is not good }
Sie können dort tun, was Sie möchten Benutzer und setzen Sie EditText auf leer, ich weiß nicht, ob dies Ihre Frage beantwortetErweiterung der Antwort von Pratik und Zac. Zac hat einen kleinen Fehler von Pratik in seiner Antwort behoben. Ich habe jedoch festgestellt, dass Code keine negativen Werte unterstützt, sondern eine NumberFormatException auslöst. Verwenden Sie den folgenden Code, um dies zu beheben und zuzulassen, dass der MIN negativ ist.
Fügen Sie diese Zeile (fett) zwischen die beiden anderen Zeilen ein:
newVal = newVal.substring (0, dstart) + source.toString () + newVal.substring (dstart, newVal.length ());
if (newVal.equalsIgnoreCase ("-") && min <0) return null;
int input = Integer.parseInt (newVal);
quelle
Wenn Sie einen Bereich mit negativen Zahlen wie -90: 90 benötigen, können Sie diese Lösung verwenden.
quelle
Ich habe den @ Ratik Sharmas-Code erweitert, um BigDecimal-Objekte anstelle von Ints zu verwenden, damit größere Zahlen akzeptiert werden können, und alle Formatierungen im EditText zu berücksichtigen, die keine Zahlen sind (wie Währungsformatierungen, dh Leerzeichen, Kommas und Punkte).
BEARBEITEN: Beachten Sie, dass diese Implementierung 2 als minimale signifikante Zahlen hat, die auf der BigDecimal festgelegt wurden (siehe die Konstante MIN_SIG_FIG), da ich sie für die Währung verwendet habe, sodass immer 2 führende Zahlen vor dem Dezimalpunkt standen. Ändern Sie die Konstante MIN_SIG_FIG nach Bedarf für Ihre eigene Implementierung.
quelle
Ich habe meine eigene Antwort gefunden. Es ist jetzt sehr spät, aber ich möchte es mit Ihnen teilen. Ich implementiere diese Schnittstelle:
Und implementieren Sie es dann folgendermaßen in Ihre Aktivität:
Dies ist eine sehr einfache Antwort. Wenn es besser ist, sagen Sie es mir bitte.
quelle
In der akzeptierten Antwort stimmt etwas nicht.
Wenn ich den Cursor in die Mitte des Textes bewege und dann etwas eingebe, führt die obige Anweisung zu einem falschen Ergebnis. Geben Sie beispielsweise zuerst "12" und dann "0" zwischen 1 und 2 ein. Die oben genannte Anweisung erzeugt dann "120" anstelle von 102. Ich habe diese Anweisung in die folgenden Anweisungen geändert:
quelle
Kotlin, wenn jemand es braucht (Use Utilities)
Verwenden Sie dies dann aus Ihrer Kotlin-Klasse
Dieser EditText erlaubt 1 bis 100.
Verwenden Sie dies dann aus Ihrem XML
quelle
Ich habe es einfacher gemacht, ein Min / Max auf einen Edittext zu setzen. Ich benutze die arithmetische Tastatur und arbeite mit dieser Methode:
Die Methode akzeptiert alle Ihre Werte, aber wenn ein Wert von Benutzern Ihre Grenzwerte nicht einhält, wird er automatisch auf das Min / Max-Limit gesetzt. Zum Beispiel. limit limin = 10, limax = 80 wenn der Benutzer 8 setzt, wird automatisch 10 in einer Variablen gespeichert und EditText wird auf 10 gesetzt.
quelle
Ich weiß, dass es bereits eine Million Antworten darauf gibt, von denen eine akzeptiert wird. Die akzeptierte Antwort enthält jedoch zahlreiche Fehler, und die meisten anderen beheben einfach einen (oder möglicherweise zwei) von ihnen, ohne auf alle möglichen Anwendungsfälle auszuweiten.
Daher habe ich im Grunde genommen die meisten in den Support-Antworten vorgeschlagenen Fehlerkorrekturen zusammengestellt und eine Methode hinzugefügt, mit der Zahlen außerhalb des Bereichs kontinuierlich in Richtung 0 eingegeben werden können (wenn der Bereich nicht bei 0 beginnt), zumindest bis dies der Fall ist sicher, dass es nicht mehr im Bereich sein kann. Denn um klar zu sein, ist dies das einzige Mal, dass bei vielen anderen Lösungen wirklich Probleme auftreten.
Hier ist das Update:
Beachten Sie, dass einige Eingabefälle nicht "aktiv" behandelt werden können (dh wenn der Benutzer sie eingibt). Daher müssen wir sie ignorieren und behandeln, nachdem der Benutzer den Text bearbeitet hat.
So können Sie es verwenden:
Wenn der Benutzer nun versucht, eine Zahl einzugeben, die näher an 0 liegt, als es der Bereich zulässt, geschieht eines von zwei Dingen:
Wenn
min
undmax
die gleiche Anzahl von Ziffern haben, dürfen sie diese nicht mehr eingeben, sobald sie die letzte Ziffer erreicht haben.Wenn eine Zahl außerhalb des Bereichs im Feld verbleibt, wenn der Text den Fokus verliert, wird er automatisch an die nächstgelegene Grenze angepasst.
Und natürlich darf der Benutzer niemals einen Wert eingeben, der weiter von 0 entfernt ist, als es der Bereich zulässt, und es ist aus diesem Grund auch nicht möglich, dass sich eine solche Zahl "versehentlich" im Textfeld befindet.
Bekannte Probleme?)
EditText
Fokus verloren geht, wenn der Benutzer damit fertig ist.Die andere Option ist die Bereinigung, wenn der Benutzer die Taste "Fertig" / "Zurück" drückt. In vielen oder sogar den meisten Fällen führt dies jedoch zu einem Fokusverlust.
Durch Schließen der Softtastatur wird das Element jedoch nicht automatisch unscharf. Ich bin mir sicher, dass 99,99% der Android-Entwickler dies wünschen (und dass der Fokus auf
EditText
Elemente im Allgemeinen weniger ein Sumpf war), aber bis jetzt gibt es keine eingebaute Funktionalität dafür. Die einfachste Methode, die ich gefunden habe, um dies zu umgehen, besteht darin,EditText
Folgendes zu erweitern :Dadurch wird der Filter dazu gebracht, die Eingabe zu bereinigen, obwohl die Ansicht den Fokus nicht wirklich verloren hat. Wenn die Ansicht später selbst den Fokus verliert, wird die Eingabesanierung erneut ausgelöst, aber es ändert sich nichts, da sie bereits behoben wurde.
Schließen
Wütend. Das war viel. Was ursprünglich so aussah, als wäre es ein ziemlich trivial einfaches Problem, und am Ende wurden viele kleine hässliche Teile von Vanille-Android (zumindest in Java) entdeckt. Und noch einmal, Sie müssen den Listener nur hinzufügen und erweitern,
EditText
wenn Ihr Bereich in keiner Weise 0 enthält. (Und realistisch gesehen, wenn Ihr Bereich nicht 0 enthält, sondern bei 1 oder -1 beginnt, werden Sie auch nicht auf Probleme stoßen.)Als letzte Anmerkung funktioniert dies nur für Ints . Es gibt sicherlich eine Möglichkeit, es so zu implementieren, dass es mit Dezimalstellen (
double
,float
) funktioniert , aber da weder ich noch der ursprüngliche Fragesteller dies benötigen, möchte ich nicht besonders tief darauf eingehen. Es wäre sehr einfach, die Filterung nach Abschluss zusammen mit den folgenden Zeilen zu verwenden:Sie müssten nur von
int
zufloat
(oderdouble
) wechseln , das Einfügen eines einzelnen.
(oder,
, je nach Land?) Zulassen und als einen der Dezimaltypen anstelle von a analysierenint
.Das erledigt sowieso den größten Teil der Arbeit, also würde es sehr ähnlich funktionieren.
quelle
quelle
Sehr einfaches Beispiel für Kotlin:
quelle
Bitte überprüfen Sie diesen Code
Verwenden Sie den folgenden Link für weitere Details zu edittext und den edittextfiltern mit Text Watcher.
http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/
quelle
Wenn Sie nur über das maximale Limit besorgt sind, fügen Sie einfach die folgende Zeile hinzu
Wenn Sie ein Mindestlimit hinzufügen müssen, können Sie dies in diesem Fall auf diese Weise tun. Das Mindestlimit beträgt 7. Der Benutzer darf nur Zeichen zwischen dem Mindest- und dem Höchstlimit (zwischen 8 und 10) eingeben.
Wenn Sie den Benutzer auch einschränken müssen, um beim Start 01 einzugeben, ändern Sie die Bedingung auf diese Weise
Am Ende Aufrufmethode wie
quelle
@Pratik Sharma
Fügen Sie zur Unterstützung negativer Zahlen den folgenden Code in die Filtermethode ein :
Verwenden Sie dann dies aus Ihrer Aktivität:
Stellen Sie Ihren Edittext ein mit:
quelle
// hat immer noch ein Problem, aber hier können Sie min, max in jedem Bereich (positiv oder negativ) verwenden.
quelle
Um die Antwort von Pratik zu ergänzen, gibt es hier eine modifizierte Version, in der der Benutzer mindestens 2 Ziffern eingeben kann, z. B. 15 bis 100:
Hoffe das hilft. Bitte stimmen Sie nicht ohne Grund ab.
quelle
So habe ich es benutzt, es funktioniert für negative Zahlen
Erstellen Sie zunächst die MinMaxFIlter.java-Klasse mit dem folgenden Code:
Erstellen Sie dann Ihren Filter und stellen Sie ihn wie folgt auf Ihren Edittext ein:
quelle
Das ist mein Code max = 100, min = 0
xml
Java
quelle
Sie können dies mit einem InputFilter tun. Anscheinend gibt es nur diese Eingangsfilterschnittstelle, die Sie verwenden können. Bevor Sie es auf nervige Weise tun und eine neue Klasse erstellen, die den Eingabefilter erweitert, können Sie diese Verknüpfung mit einer Schnittstelleninstanziierung der inneren Klasse verwenden.
Deshalb machst du einfach folgendes:
In diesem Beispiel überprüfe ich, ob der Wert des EditText größer als 8 ist. Wenn nicht, soll er auf 8 gesetzt werden. Daher müssen Sie sich anscheinend selbst mit dem Min-Max oder einer beliebigen Filterlogik auseinandersetzen. Aber zumindest können Sie die Filterlogik ziemlich ordentlich und kurz direkt in den EditText schreiben.
Hoffe das hilft
quelle
Um den Mindestwert des EditText zu definieren, habe ich Folgendes verwendet:
quelle
@ Patriks Code hat eine nette Idee, aber mit vielen Fehlern. @Zac und @Anthony B (Lösungen mit negativen Zahlen) haben einige von ihnen gelöst, aber der Code von @ Zac enthält immer noch 3 Bürgermeister-Fehler:
1. Wenn der Benutzer alle Einträge im EditText löscht, kann keine Nummer erneut eingegeben werden. Dies kann natürlich mit einem von EditText geänderten Listener für jedes Feld gesteuert werden, aber es macht die Schönheit der Verwendung einer gemeinsamen InputFilter-Klasse für jedes Feld zunichte EditText in Ihrer App.
2. Hat @ Guernee4 gesagt, wenn zum Beispiel min = 3 ist, ist es unmöglich, eine Zahl einzugeben, die mit 1 beginnt.
3. Wenn zum Beispiel min = 0 ist, können Sie viele Nullen eingeben, die Sie wünschen, dass das Ergebnis nicht elegant ist. Unabhängig davon, wie hoch der Mindestwert ist, kann der Benutzer den Cursor auf die linke Größe der ersten Zahl setzen, eine Reihe führender Nullen nach links, die ebenfalls nicht elegant sind.
Ich bin auf diese kleinen Änderungen von @ Zacs Code gekommen, um diese 3 Fehler zu beheben. In Bezug auf Fehler Nr. 3 konnte ich immer noch nicht alle führenden Nullen auf der linken Seite vollständig entfernen. Es kann immer eins sein, aber ein 00, 01, 0100 usw. ist in diesem Fall eleganter und gültig als ein 000000, 001, 000100 usw. usw. Etc.
Hier ist der Code:
Einen schönen Tag noch!
quelle
Hier ist meine Sicht auf Pratik Sharmas Antwort für
Kotlin
undDouble
wenn jemand sie brauchtquelle