- Есть ли способ определить минимальное и максимальное значение для EditText в Android?
- 18 ответов
- Есть ли способ определить минимальное и максимальное значение для EditText в Android?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
- Ответ 16
- Ответ 17
- Ответ 18
- Ответ 19
- Ответ 20
- Ответ 21
Есть ли способ определить минимальное и максимальное значение для EditText в Android?
Я хочу, чтобы определить минимальное и максимальное значение EditText .
например: если кто-либо попытается ввести значение месяца в нем, значение должно быть между 1 и 12.
Я могу сделать это с помощью TextWatcher но я хочу знать, есть ли другой способ сделать это в файле макета или в другом месте.
изменить: Я не хочу ограничивать количество персонажей. Я хочу ограничить значение. Например, если я ограничу месяц EditText W символов при вводе 12 он примет его, но если я войду 22 он не должен принимать его, пока я вхожу.
18 ответов
сначала сделайте этот класс:
затем используйте это из своей деятельности:
Это позволит пользователю ввести значения от 1 до 12 только.
EDIT:
установите edittext с android:inputType=»number» .
в коде Пратика есть небольшая ошибка. Например, если значение равно 10 и вы добавляете 1 в начале, чтобы сделать 110, функция фильтра будет рассматривать новое значение как 101.
см. ниже для исправления этого:
расширение ответа Пратика и Зака. Зак исправил небольшую ошибку Пратика в своем ответе. Но я отметил, что код не поддерживает отрицательные значения, он будет вызывать исключение NumberFormatException. Чтобы исправить это и позволить мин быть отрицательным, используйте следующий код.
добавьте эту строку (жирным шрифтом) между двумя другими строками:
newVal = newVal.подстрока(0, dstart) + источник.toString ()+ newVal.подстрока(dstart, newVal.length());
if (newVal.equalsIgnoreCase (» — » ) & & min
int input = целое число.parseInt(newVal);
из того, что я видел в решении @Patrik и добавлении @Zac, предоставленный код все еще имеет большую проблему:
если min==3 тогда невозможно ввести любое число, начинающееся с 1 или 2 (например: 15, 23)
Если min>=10 тогда невозможно ввести что-либо, так как каждое число должно начинаться с 1,2,3.
в моем понимании мы не можем достичь ограничения min-max EditText ‘s значение с простым использованием класса InputFilterMinMax , по крайней мере, не для мин Значение, потому что, когда пользователь вводит положительное число, значение растет, и мы можем легко выполнить тест на лету, чтобы проверить, достиг ли он предела или вышел за пределы диапазона и блокировать записи, которые не соответствуют. Тестирование значения min-это другая история, поскольку мы не можем быть уверены, закончил ли пользователь печатать или нет, и поэтому не можем решить, следует ли блокировать или нет.
это не совсем то, что OP запросил, но для целей проверки я объединил в своем решении InputFilter для проверки максимальных значений, с OnFocusChangeListener для повторного тестирования минимального значения, когда EditText теряет фокус, предполагая, что пользователь закончил печатать, и это что-то вроде этого :
затем в Activity установите InputFilterMax и OnFocusChangeListenerMin to EditText Примечание: Вы можете 2 мин и Макс в onFocusChangeListener .
я расширил код @Pratik Sharmas, чтобы использовать BigDecimal объекты вместо ints, чтобы он мог принимать большие числа и учитывать любое форматирование в EditText, которое не является числом (например, форматирование валюты, т. е. пробелы, запятые и периоды)
EDIT: обратите внимание, что эта реализация имеет 2 как минимум значимые цифры, установленные на BigDecimal (см. константу MIN_SIG_FIG), поскольку я использовал ее для валюты, поэтому перед десятичной точкой всегда было 2 ведущих числа. Изменить Min_sig_fig константа, необходимая для вашей собственной реализации.
Если вам нужен диапазон с отрицательными числами как -90:90, вы можете использовать это решение.
Я сделал более простой способ установить min / max в Edittext. Я использую арифметическую клавиатуру, и я работаю с этим методом:
метод принимает все ваши значения, но если значение пользователей не соответствует вашим ограничениям, оно будет автоматически установлено в min / max limit. Для экс. limit limin=10, limax =80 если пользователь устанавливает 8, автоматически 10 сохраняется в переменную, а EditText — в 10.
пожалуйста, проверьте этот код
используйте ссылку ниже для получения дополнительной информации об edittext и edittextfilteres с text watcher..
Я нашел свой собственный ответ. Сейчас уже очень поздно, но я хочу поделиться этим с вами. Я реализую этот интерфейс:
а затем реализовать его таким образом внутри вашей деятельности:
Это очень простой ответ, если лучше подскажите пожалуйста.
в принятом ответе есть что-то неправильное.
Если я перемещаю курсор в середину текста, затем введите что-то, то приведенное выше утверждение приведет к неправильному результату. Например, сначала введите «12», затем введите» 0 «между 1 и 2, затем оператор, упомянутый выше, произведет» 120 » вместо 102. Я изменил это утверждение на утверждения ниже:
если вы только обеспокоены максимальным пределом, просто добавьте ниже строку в
Если вам нужно добавить минимальный предел, то вы можете сделать так, как в этом случае минимальный предел 7. пользователь ограничен для ввода символа между мин и Макс предел (между 8 и 10)
Если Вам также нужно ограничить пользователя, чтобы ввести 01 при запуске, то измените, если условие, как этот путь
в конце вызова метода, как
поддержка отрицательные числа добавьте следующий код внутри фильтр способ:
затем используйте это из своей деятельности:
установите edittext с помощью:
/ / все еще имеет некоторые проблемы, но здесь вы можете использовать min, max в любом диапазоне (положительный или отрицательный)
чтобы добавить к ответу Пратика, вот модифицированная версия, где пользователь может ввести min 2 цифры также, например, от 15 до 100:
добавлено: if (end==1) min=целое число.parseInt (source.toString ());
надеюсь, что это помогает. пожалуйста, не downvote без причин.
я знаю, что на это уже есть миллион ответов, с одним принятым. Тем не менее, в принятом ответе есть множество ошибок, и большинство остальных просто исправляют один (или, возможно, два) из них, не расширяя все возможные варианты использования.
поэтому я в основном скомпилировал большинство исправлений ошибок, предложенных в ответах поддержки, а также добавил метод, позволяющий непрерывный ввод чисел за пределами диапазона в направлении 0 (если диапазон не начинается с 0), по крайней мере, пока он не будет уверен,что он больше не может находиться в пределах досягаемости. Потому что, чтобы быть ясным, это единственное время, которое действительно вызывает проблемы со многими другими решениями.
обратите внимание, что некоторые случаи ввода невозможно обрабатывать «активно» (т. е., как пользователь вводит его), поэтому мы должны игнорировать их и обрабатывать их после того, как пользователь закончит редактирование текста.
вот как вы могли бы использовать его:
теперь, когда пользователь пытается чтобы ввести число ближе к 0, чем позволяет диапазон, произойдет одна из двух вещей:
если min и max имеют одинаковое количество цифр, им не будет разрешено вводить его вообще, как только они доберутся до конечной цифры.
если число вне диапазона остается в поле, когда текст теряет фокус, оно будет автоматически скорректировано до ближайшей границы.
и конечно, пользователь никогда не позволяйте вводить значение дальше 0, чем позволяет диапазон, и по этой причине такое число не может «случайно» находиться в текстовом поле.
известная проблема(ы?)
- это работает только, если EditText теряет фокус, когда пользователь закончит с ним.
другой вариант дезинфицирует, когда пользователь нажимает клавишу»готово» /return, но во многих или даже в большинстве случаев это приводит к потере фокуса в любом случае.
тем не менее, закрытие мягкой клавиатуры будет не автоматически расфокусировать элемент. Я уверен, что 99,99% разработчиков Android хотят, чтобы это было (и что фокус обработки на EditText elements было меньше трясины в целом), но пока для него нет встроенной функциональности. Самый простой метод, который я нашел, чтобы обойти это, если вам нужно, — это расширить EditText что-то вроде этого:
это будет «обмануть» фильтр в дезинфекция ввода, даже если представление не на самом деле потерял фокус. Если позднее представление потеряет фокус на самом себе, то санитария ввода снова запустится, но ничего не изменится, так как она уже была исправлена.
закрытие
уфф. Это было много. То, что первоначально казалось, что это будет довольно тривиально простая проблема, закончилось обнаружением многих маленьких уродливых кусочков vanilla Android (по крайней мере, на Java). И вновь, вам нужно только добавить слушателя и продлить EditText если ваш диапазон каким-то образом не включает 0. (и реально, если ваш диапазон не включает 0, но начинается с 1 или -1, вы также не столкнетесь с проблемами.)
как последнее замечание, это работает только для ints. Конечно, есть способ реализовать его для работы с десятичными знаками ( double , float ), но поскольку ни я, ни оригинальный Аскер не нуждаются в этом, я не особенно хочу получить все настолько глубоко. Было бы очень легко просто использовать фильтрацию после завершения вместе со следующими строками:
вам нужно будет только изменить от int to float (или double ), разрешить вставку одного . (или , в зависимости от страны?), и анализировать как один из десятичных типов вместо int .
который обрабатывает большую часть работы в любом случае, поэтому он будет работать очень похоже.
Источник
Есть ли способ определить минимальное и максимальное значение для EditText в Android?
Я хочу определить минимальное и максимальное значение для EditText .
Например: если какой-либо человек пытается ввести в него значение месяца, значение должно быть между 1-12.
Я могу сделать это, используя TextWatcher , но я хочу знать, есть ли другой способ сделать это в файле макета или в другом месте.
Изменить: Я не хочу ограничивать количество символов. Я хочу ограничить значение. Например, если я ограничу месяц EditText w символов при вводе 12, он примет его, но если я вхожу 22, он не должен принимать его во время ввода.
ОТВЕТЫ
Ответ 1
Сначала сделайте этот класс:
Затем используйте это в своей деятельности:
Это позволит пользователю вводить значения только от 1 до 12.
EDIT:
Задайте свой edittext с помощью android:inputType=»number» .
Ответ 2
В коде Pratik имеется небольшая ошибка. Например, если значение равно 10, и вы добавите 1 в начале, чтобы сделать 110, функция фильтра будет обрабатывать новое значение как 101.
Ниже приведено исправление:
Ответ 3
Продолжение ответа Пратика и Зак. Зак исправил небольшую ошибку Пратика в его ответе. Но я не заметил, что код не поддерживает отрицательные значения, он будет вызывать исключение NumberFormatException. Чтобы исправить это, и позвольте MIN быть отрицательным, используйте следующий код.
Добавьте эту строку (жирным шрифтом) между двумя другими строками:
newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart, newVal.length());
, если (newVal.equalsIgnoreCase( «-» ) & min
Ответ 4
Я расширил код @Pratik Sharmas, чтобы использовать объекты BigDecimal вместо int, чтобы он мог принимать большие числа и учитывать любое форматирование в EditText, которое не является числом (например, форматирование валюты, т.е. пробелы, запятые и периоды)
EDIT: обратите внимание, что эта реализация имеет 2 как минимальные значащие цифры, установленные в BigDecimal (см. константу MIN_SIG_FIG), поскольку я использовал ее для валюты, поэтому перед десятичной точкой всегда было 2 ведущих числа. Измените константу MIN_SIG_FIG по мере необходимости для своей собственной реализации.
Ответ 5
Из того, что я видел в решении @Patrik и добавлении @Zac, предоставленный код все еще имеет большую проблему:
Если min==3 , тогда невозможно ввести любое число, начинающееся с 1 или 2 (например: 15, 23)
Если min>=10 , тогда невозможно ввести что-либо, поскольку каждое число должно начинаться с 1,2,3.
В моем понимании мы не можем достичь ограничения min-max значения EditText при простом использовании класса InputFilterMinMax , по крайней мере, не для минимального значения, поскольку, когда пользователь вводит положительное число, значение и мы можем легко выполнить «на лету» тест, чтобы проверить, достиг ли он предела, или вышел за пределы диапазона и заблокировал записи, которые не соответствуют. Тестирование значения min — это другая история, поскольку мы не можем быть уверены, что пользователь закончил набирать или нет, и поэтому не может решить, следует ли блокировать или нет.
Это не совсем то, что запрошено OP, но для целей проверки я объединил в своем решении InputFilter для проверки максимальных значений, а OnFocusChangeListener перепроверить минимальное значение, когда EditText теряет фокус, предполагая пользователь закончил печатать, и это примерно так:
Затем в Activity установите InputFilterMax и OnFocusChangeListenerMin в EditText Примечание: вы можете использовать оба значения min и max в OnFocusChangeListener .
Ответ 6
Если вам нужен диапазон с отрицательными номерами, например, -90: 90, вы можете использовать это решение.
Ответ 7
В принятом ответе есть что-то не так.
Если я перемещаю курсор в середину текста, тогда наберите что-то, тогда приведенное выше утверждение приведет к неправильному результату. Например, сначала введите «12», затем введите «0» между 1 и 2, тогда упомянутое выше выражение произведет «120» вместо 102. Я изменил это утверждение на следующие утверждения:
Ответ 8
Я сделал более простой способ установить min/max в Edittext. Я использую арифметическую клавиатуру, и я работаю с этим методом:
Метод принимает все ваши значения, но если значение пользователей не будет соответствовать вашим лимитам, оно будет автоматически установлено на ограничение min/max. Напр. limit limin = 10, limax = 80, если пользователь устанавливает 8, автоматически 10 сохраняется в переменной, а EditText — 10.
Ответ 9
проверьте этот код
Следуйте приведенной ниже ссылке для получения дополнительной информации о edittext и edittextfilteres с наблюдателем текста.
Ответ 10
Я нашел свой собственный ответ. Сейчас очень поздно, но я хочу поделиться им с вами. Я реализую этот интерфейс:
И затем реализуйте его таким образом внутри своей деятельности:
Это очень простой ответ, если лучше, скажите мне.
Ответ 11
Ответ 12
Если вас беспокоит только максимальный предел, просто добавьте строку ниже
Если вам нужно добавить минимальный лимит, вы можете сделать это так, в этом случае минимальный лимит равен 7. Пользователь ограничен, чтобы вводить символ между минимальным и максимальным лимитом (между 8 и 10).
Если вам также необходимо ограничить пользователя, чтобы он вводил 01 при запуске, измените его, если это так.
В конце метода вызова, например
Ответ 13
Для поддержки отрицательных чисел добавьте следующий код в методе фильтра:
Затем используйте это из вашей деятельности:
Установите ваш текст редактирования с помощью:
Ответ 14
//все еще есть какая-то проблема, но здесь вы можете использовать min, max в любом диапазоне (положительном или отрицательном)
Ответ 15
Чтобы добавить к ответу Pratik, здесь приведена модифицированная версия, в которой пользователь может ввести не менее двух цифр, например, от 15 до 100:
добавил: if (end == 1) мин = Integer.parseInt(source.toString());
Надеюсь, это поможет. любезно не спускайте без причины.
Ответ 16
Я знаю, что на этот вопрос уже есть миллион ответов, один из которых принят. Однако в принятом ответе есть множество ошибок, и большинство остальных просто исправляют один (или, может быть, два) из них, не распространяясь на все возможные варианты использования.
Поэтому я в основном скомпилировал большинство исправлений ошибок, предложенных во вспомогательных ответах, а также добавил метод, позволяющий непрерывный ввод чисел вне диапазона в направлении 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 .
Это в любом случае обрабатывает большую часть работы, поэтому будет работать очень похоже.
Ответ 17
здесь, как я использовал, это работает для отрицательного числа
Сначала создайте класс MinMaxFIlter.java со следующим кодом:
Затем создайте и установите свой фильтр для вашего текста редактирования следующим образом:
Ответ 18
это мой код max = 100, min = 0
Ответ 19
Очень простой пример на Kotlin:
Ответ 20
Вы можете сделать это с помощью InputFilter. Видимо, вы можете использовать только этот интерфейс входного фильтра. Прежде чем вы сделаете это раздражающим способом создания нового класса, который расширяет фильтр ввода, вы можете использовать этот ярлык с экземпляром интерфейса внутреннего класса.
Поэтому вы просто делаете это:
В этом примере я проверяю, больше ли значение EditText, чем 8. Если нет, то оно должно быть установлено на 8. Так что вам нужно поработать с min max или любой другой логикой фильтра самостоятельно. Но, по крайней мере, вы можете написать логику фильтра довольно аккуратно и коротко прямо в EditText.
Надеюсь это поможет
Ответ 21
это простой способ в xml:
Если вам нужно установить 4 символа в текстовом редакторе xml, используйте это:
Источник