Я хочу определить минимальное и максимальное значение для EditText
.
Например: если кто-то пытается ввести в него значение месяца, значение должно быть от 1 до 12.
Я могу сделать это с помощью, TextWatcher
но я хочу знать, есть ли другой способ сделать это в файле макета или где-то еще.
Изменить: я не хочу ограничивать количество символов. Я хочу ограничить ценность. Например, если я EditText
ограничу количество символов месяца w при вводе 12, он примет его, но если я введу 22, он не должен принимать его во время ввода.
android
android-edittext
mertaydin
источник
источник
Ответы:
Сначала сделайте этот класс:
Затем используйте это из своей деятельности:
Это позволит пользователю вводить только значения от 1 до 12 .
РЕДАКТИРОВАТЬ :
Установите текст редактирования с помощью
android:inputType="number"
.Вы можете найти более подробную информацию на https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/ .
Спасибо.
источник
source
заменят некоторые символы вdest
. Я думаю, вам следует смоделировать замену и получить конечный результат, а затем подтвердить его.В коде Pratik есть небольшая ошибка. Например, если значение равно 10, и вы добавляете 1 в начале, чтобы получить 110, функция фильтрации будет рассматривать новое значение как 101.
См. Ниже исправление этого:
источник
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());
, выглядит более чистым и понятным.min==3
тогда невозможно ввести любое число, начинающееся с 1 или 2 (например: 15, 23)Из того, что я видел в решении @ Patrik и добавлении @Zac, предоставленный код все еще имеет большую проблему:
Если
min==3
тогда невозможно ввести любое число, начинающееся с 1 или 2 (например: 15, 23),Если
min>=10
тогда невозможно ввести что-либо, так как каждое число должно начинаться с 1,2,3 ...Насколько я понимаю, мы не можем достичь ограничения min-max значения an
EditText
с помощью простого использования классаInputFilterMinMax
, по крайней мере, не для минимального значения, потому что, когда пользователь вводит положительное число, значение увеличивается, и мы можем легко выполнить Тест на лету, чтобы проверить, достиг ли он предела или вышел за пределы диапазона, и заблокировать записи, которые не соответствуют требованиям. Тестирование минимального значения - это другая история, поскольку мы не можем быть уверены, закончил ли пользователь ввод или нет, и поэтому не можем решить, следует ли нам блокировать или нет.Это не совсем то, что запрашивал OP, но для целей проверки я объединил в своем решении
InputFilter
для проверки максимальных значений сOnFocusChangeListener
повторной проверкой минимального значения, когда онEditText
теряет фокус, предполагая, что пользователь закончил ввод, и это примерно так:И
OnFocusChangeListenerMin
Затем в деятельности установить
InputFilterMax
иOnFocusChangeListenerMin
наEditText
заметку: Вы можете 2 как минимальное и максимальное вonFocusChangeListener
.источник
if(Integer.valueOf(val)<min){ //Notify user that the value is not good }
Вы можете делать там, что хотите, уведомить user и установите EditText в пустое значение, я не знаю, отвечает ли это на ваш вопросПродолжение ответа Пратика и Зака. Зак исправил небольшую ошибку Пратика в своем ответе. Но я заметил, что код не поддерживает отрицательные значения, он выдаст исключение NumberFormatException. Чтобы исправить это и позволить MIN быть отрицательным, используйте следующий код.
Добавьте эту строку (выделенную жирным шрифтом) между двумя другими строками:
newVal = newVal.substring (0, dstart) + source.toString () + newVal.substring (dstart, newVal.length ());
if (newVal.equalsIgnoreCase ("-") && min <0) return null;
int input = Integer.parseInt (newVal);
источник
Если вам нужен диапазон с отрицательными числами, например -90: 90, вы можете использовать это решение.
источник
Я расширил код @Pratik Sharmas, чтобы использовать объекты BigDecimal вместо целых чисел, чтобы он мог принимать более крупные числа, и учитывать любое форматирование в EditText, которое не является числом (например, форматирование валюты, то есть пробелы, запятые и точки)
РЕДАКТИРОВАТЬ: обратите внимание, что эта реализация имеет 2 в качестве минимальных значащих цифр, установленных в BigDecimal (см. Константу MIN_SIG_FIG), поскольку я использовал ее для валюты, поэтому всегда было 2 ведущих числа перед десятичной точкой. Измените константу MIN_SIG_FIG, если это необходимо для вашей собственной реализации.
источник
Я нашел свой ответ. Уже очень поздно, но я хочу поделиться этим с вами. Реализую этот интерфейс:
А затем реализовать это в своей деятельности таким образом:
Это очень простой ответ, расскажите, пожалуйста, лучше.
источник
В принятом ответе что-то не так.
Если я наведу курсор в середину текста, а затем что-нибудь наберу, то приведенный выше оператор даст неверный результат. Например, сначала введите «12», затем введите «0» между 1 и 2, затем приведенный выше оператор даст «120» вместо 102. Я изменил этот оператор на следующие операторы:
источник
Котлин, если он кому-то нужен (используйте утилиты)
Затем используйте это из своего класса Kotlin
Этот EditText допускает от 1 до 100.
Затем используйте это из своего XML
источник
Я сделал более простой способ установить минимальное / максимальное значение для Edittext. Я использую арифметическую клавиатуру и работаю по такому методу:
Метод принимает все ваши значения, но если значение пользователей не соответствует вашим ограничениям, оно будет автоматически установлено на минимальный / максимальный предел. Например, limit limin = 10, limax = 80, если пользователь устанавливает 8, автоматически 10 сохраняется в переменную, а EditText устанавливается на 10.
источник
Я знаю, что на это уже есть миллион ответов, и один принят. Однако в принятом ответе есть множество ошибок, а большинство остальных просто исправляют одну (или, может быть, две) из них, не расширяя все возможные варианты использования.
Таким образом, я в основном скомпилировал большинство исправлений ошибок, предложенных в ответах службы поддержки, а также добавил метод, позволяющий непрерывно вводить числа за пределами диапазона в направлении 0 (если диапазон не начинается с 0), по крайней мере, до тех пор, пока он уверен, что его больше не может быть в диапазоне. Потому что, чтобы быть ясным, это единственный раз, когда действительно возникают проблемы со многими другими решениями.
Вот исправление:
Обратите внимание, что некоторые варианты ввода невозможно обработать «активно» (т. Е. Пока пользователь вводит их), поэтому мы должны игнорировать их и обрабатывать их после того, как пользователь закончит редактировать текст.
Вот как это можно использовать:
Теперь, когда пользователь пытается ввести число ближе к 0, чем позволяет диапазон, произойдет одно из двух:
Если
min
иmax
имеют одинаковое количество цифр, им не будет разрешено вводить его вообще, как только они дойдут до последней цифры.Если число, выходящее за пределы диапазона, остается в поле, когда текст теряет фокус, он будет автоматически настроен на ближайшую границу.
И, конечно же, пользователю никогда не будет разрешено вводить значение дальше 0, чем позволяет диапазон, и по этой причине такое число не может «случайно» оказаться в текстовом поле.
Известные проблемы?)
EditText
объект теряет фокус, когда пользователь покончил с ним.Другой вариант - очистка, когда пользователь нажимает клавишу «готово» / «возврат», но во многих или даже в большинстве случаев это все равно приводит к потере фокуса.
Однако закрытие программной клавиатуры не снимает фокус с элемента автоматически. Я уверен, что 99,99% разработчиков Android этого пожелают (и
EditText
такая обработка фокуса на элементах в целом была не такой уж большой проблемой), но пока для этого нет встроенных функций. Самый простой способ, который я нашел, чтобы обойти это, если вам нужно, - это расширитьEditText
что-то вроде этого:Это «обманом» заставит фильтр очистить ввод, даже если представление фактически не потеряло фокус. Если в дальнейшем произойдет потеря фокуса в представлении, очистка ввода сработает снова, но ничего не изменится, поскольку оно уже было исправлено.
закрытие
Уф. Это было много. То, что поначалу казалось тривиально простой задачей, в конечном итоге привело к обнаружению множества уродливых кусочков ванильного Android (по крайней мере, на Java). И еще раз, вам нужно только добавить слушателя и расширить,
EditText
если ваш диапазон каким-то образом не включает 0. (И реально, если ваш диапазон не включает 0, но начинается с 1 или -1, вы также не столкнетесь с проблемами.)И последнее замечание: это работает только для целых чисел . Конечно, есть способ реализовать его для работы с десятичными знаками (
double
,float
), но, поскольку ни мне, ни первоначальному пользователю, задающему вопрос, это не нужно, я не особо хочу вдаваться в подробности. Было бы очень просто использовать фильтрацию после завершения вместе со следующими строками:Вам нужно будет только изменить с
int
наfloat
(илиdouble
), разрешить вставку одного.
(или,
, в зависимости от страны?) И проанализировать как один из десятичных типов вместоint
.Это в любом случае выполняет большую часть работы, поэтому будет работать очень похоже.
источник
источник
Очень простой пример на Котлине:
источник
пожалуйста, проверьте этот код
Воспользуйтесь ссылкой ниже, чтобы получить дополнительные сведения о edittext и edittextfilteres с наблюдателем текста.
http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/
источник
Если вас беспокоит только максимальный лимит, просто добавьте строку ниже в
Если вам нужно добавить минимальный предел, вы можете сделать так, в этом случае минимальный предел равен 7. Пользователь может вводить символ между минимальным и максимальным пределом (между 8 и 10).
Если вам также нужно ограничить пользователя вводом 01 при запуске, измените условие, подобное этому
В конце вызовите метод вроде
источник
@Pratik Sharma
Для поддержки отрицательных чисел добавьте следующий код в метод фильтрации :
Затем используйте это из своей деятельности:
Установите текст редактирования с помощью:
источник
// все еще есть проблема, но здесь вы можете использовать min, max в любом диапазоне (положительном или отрицательном)
источник
Чтобы добавить к ответу Pratik, вот измененная версия, в которой пользователь также может ввести минимум 2 цифры, например, от 15 до 100:
Надеюсь это поможет. любезно не голосуйте против без причины.
источник
вот как я использовал, он работает для отрицательного числа
Сначала создайте класс MinMaxFIlter.java со следующим кодом:
Затем создайте и установите свой фильтр на свой текст редактирования следующим образом:
источник
это мой код max = 100, min = 0
XML
Ява
источник
Вы можете сделать это с помощью InputFilter. По-видимому, вы можете использовать именно этот интерфейс входного фильтра. Прежде чем вы сделаете это раздражающим способом и создадите новый класс, который расширяет фильтр ввода, вы можете использовать этот ярлык с экземпляром интерфейса внутреннего класса.
Поэтому вы просто делаете это:
В этом примере я проверяю, больше ли значение EditText, чем 8. Если нет, оно должно быть установлено на 8. Так что, кстати, вам нужно самостоятельно согласовать минимальное максимальное значение или любую другую логику фильтра. Но, по крайней мере, вы можете написать довольно аккуратную и короткую логику фильтра прямо в EditText.
Надеюсь это поможет
источник
Чтобы определить минимальное значение EditText, я использовал это:
источник
Код @ Patrik имеет отличную идею, но с множеством ошибок. @Zac и @Anthony B (решения с отрицательными числами) решили некоторые из них, но в коде @Zac все еще есть 3 ошибки мэра:
1. Если пользователь удаляет все записи в EditText, невозможно ввести какое-либо число снова .. Конечно, этим можно управлять с помощью измененного обработчика EditText в каждом поле, но это сведет на нет красоту использования общего класса InputFilter для каждого поля. EditText в вашем приложении.
2. Если @ Guernee4 говорит, что если, например, min = 3, невозможно ввести любое число, начинающееся с 1.
3. Если, например, min = 0, вы можете ввести сколько угодно нулей, что не будет элегантным результатом. Или также, если неважно, какое минимальное значение, пользователь может поместить курсор в размер слева от первого числа, а также разместить группу ведущих нулей слева, что тоже не элегантно.
Я придумал эти небольшие изменения кода @Zac, чтобы решить эти 3 ошибки. Что касается ошибки №3, мне все еще не удалось полностью удалить все ведущие нули слева; Это всегда может быть один, но 00, 01, 0100 и т. Д. В этом случае более элегантно и корректно, чем 000000, 001, 000100 и т. Д. И т. Д. И т.п.
Вот код:
Хорошего дня!
источник
Вот мой взгляд на ответ Pratik Sharma,
Kotlin
иDouble
если он кому-то нуженисточник