Как ограничить количество вводимых символов в Android Studio

Обновлено: 30.11.2022

Взаимодействие приложения с пользователем происходит несколькими способами: с помощью кнопок, списков, изображений и т. д. Большинство приложений требуют, чтобы пользователь в какой-то момент ввел данные, используя слова или числа, или и то, и другое. EditText можно использовать для ввода данных. Часто данные должны быть ограничены определенным диапазоном или типом, например целым числом, десятичным числом, числом между двумя значениями или словами, написанными с заглавной буквы. При определении EditText в макете атрибуты, такие как android:inputType, могут использоваться для ограничения того, что пользователь может вводить. Это автоматически сокращает объем кода, необходимого для проверки, поскольку требуется меньше проверок входных данных.

Интерфейс TextWatcher также полезен для ограничения значений. Как следует из названия, он может отслеживать текстовые поля и код вызова при изменении этого текста, что позволяет проверять ввод по мере ввода пользователем. В следующем примере EditText допускает только значение от 0 до 100, например, для представления процента. Код для проверки значения, когда пользователь покидает поле, не требуется, потому что все это делается по мере того, как пользователь вводит. (В этом руководстве предполагается, что приложение можно создать и запустить в Android Studio. Если вы не знакомы с программированием приложений в Studio, см. бесплатные статьи для начинающих.)

Чтобы использовать этот код, запустите новый проект Android, в этом руководстве он называется Percentage. Он использует Пустое действие с записями по умолчанию для Имя действия и Имя макета. Это простой макет с одним EditText для экрана. Удалите существующий TextView и из Palette поместите Number из Text Fields в макет activity_main.xml.

Используя список Properties для EditText, задайте для text значение 0 (это устанавливает начальное значение) и maxLength для 3< /em> (чтобы ограничить ввод тремя символами), для свойства inputType уже задано значение число. XML макета должен быть похож на этот:

В Java-классе MainActivity новый внутренний класс используется для реализации интерфейса TextWatcher. Метод afterTextChanged() будет вызываться при изменении текста при вводе текста пользователем. В этом методе вводимое значение проверяется на предмет того, больше ли оно 100. Если да, то оно устанавливается равным 100. Нет необходимости проверять значения ниже нуля, потому что они не могут быть введены (из-за свойств). try catch требуется, когда все числа удалены, и в этом случае проверка для значений выше 100 будет исключением (попытка проанализировать пустую строку). Для TextWatcher необходимо реализовать методы beforeTextChanged() и onTextChanged(), но в этом примере они пусты.

Изменение значения EditText в afterTextChanged() разрешено, поскольку передается его внутренний класс Editable (его нельзя изменить, изменив CharSequence, переданный в beforeTextChanged() и onTextChanged(), см. документацию на веб-сайте разработчиков Android. В onCreate() для Activity класс, реализующий TextWatcher, подключается к EditText с помощью addTextChangedListener. (). Импорты для TextWatcher, Editable, EditText и Log обязательны, добавьте при появлении запроса с помощью Alt-Enter (Log используется здесь только в демонстрационных целях). Вот полный код для MainActivity.java:

Запустите приложение и введите числа. Если вы введете число больше 100, оно изменится на 100, что вызовет повторный вызов метода afterTextChanged(). При использовании TextWatchers необходимо следить за тем, чтобы исполняемый код не приводил к бесконечному циклу.

Значения, ограниченные TextWatcher

При запуске приложения вы заметите, что клавиатура меняется в зависимости от типа текста. Поскольку EditText был ограничен числами, клавиатура автоматически переключается в режим ввода цифр, не позволяя вводить буквы. Это еще одно преимущество объявления соответствующих атрибутов в файле определения макета. Рекомендуется просмотреть атрибуты, поддерживаемые представлениями Android, поскольку их определение в макете XML может сократить объем кода, который необходимо написать. Дополнительные сведения об атрибутах, поддерживаемых EditText, см. в документации Android по TextView , от которого EditText является подклассом. Загрузите файл процент.zip, чтобы импортировать код для этого руководства в Studio.

См. также

Архивные комментарии

Моисей Кацина сказал в ноябре 2017 г.: Спасибо! Этот атрибут решил мою проблему, android:maxLength

Автор: Дэниел С. Фаулер Опубликовано: 31 января 2012 г. Обновлено: 29 мая 2016 г.

Поделиться
Отправить в Twitter
Отправить в Facebook
< img class="lazyload" data-src="https://tekeye.uk/md/images/linkin-but.jpg" alt="Отправить в LinkedIn" />
Отправить на Reddit
Печать страницы

У вас есть вопрос или комментарий по поводу этой статьи?

(В качестве альтернативы используйте адрес электронной почты, указанный в нижней части веб-страницы.)

↓markdown↓ CMS быстрая и простая. Быстро создавайте веб-сайты и легко публикуйте их. От новичка до эксперта.

EditText – это стандартный виджет для ввода текста в приложениях для Android. Если пользователю нужно ввести текст в приложение, это основной способ сделать это.

EditText

Существует множество важных свойств, которые можно настроить для настройки поведения EditText . Некоторые из них перечислены ниже. Подробную информацию о полях ввода см. в официальном руководстве по текстовым полям.

Использование

EditText добавляется в макет со всеми стандартными поведениями со следующим XML:

Обратите внимание, что EditText — это просто тонкое расширение TextView, наследующее все те же свойства.

Получение значения

Получение значения текста, введенного в EditText, происходит следующим образом:

Настройка типа ввода

По умолчанию любое текстовое содержимое в элементе управления EditText отображается как обычный текст. Установив inputType , мы можем упростить ввод различных типов информации, например номеров телефонов и паролей:

Самые распространенные типы ввода включают:

< tr>< td>textMultiLine
Тип Описание
textUri Текст, который будет использоваться в качестве URI
textEmailAddress Текст, который будет использоваться в качестве адреса электронной почты
textPersonName Текст, который является именем человека
textPassword Текст, который является паролем, который должен быть скрытым
textVisiblePassword Текст, кнопка «Далее» и отсутствие ввода микрофона
число Поле только для чисел
телефон Для ввода номера телефона
дата Для ввода даты
время Для ввода времени
Разрешить несколько строк текста в поле

При необходимости вы можете установить несколько атрибутов inputType (разделенных символом '|')

Дальнейшая настройка ввода

Возможно, мы захотим ограничить запись одной строкой текста (избегайте новых строк):

Вы можете ограничить количество символов, которые можно вводить в поле, используя атрибут цифр:

Это ограничит вводимые цифры только "0" и "1". Мы можем ограничить общее количество символов с помощью:

Используя эти свойства, мы можем определить ожидаемое поведение ввода для текстовых полей.

Настройка цветов

Вы можете настроить цвет фона выделения выделенного текста в EditText с помощью свойства android:textColorHighlight:

с таким результатом:


Отображение подсказок-заполнителей

Возможно, вы захотите установить подсказку для элемента управления EditText, чтобы запрашивать у пользователя определенный ввод с помощью:

что приводит к:

Подсказки

Изменение цвета нижней строки


Предполагая, что вы используете библиотеку AppCompat, вы можете переопределить стили colorControlNormal , colorControlActivated и colorControlHighlight :

Если вы не видите, что эти стили применяются в DialogFragment, существует известная ошибка при использовании LayoutInflater, переданного в метод onCreateView().

Эта проблема уже исправлена ​​в библиотеке AppCompat v23. См. это руководство о том, как выполнить обновление. Другой временный обходной путь — использовать инфлятор макета Activity вместо того, который передается в метод onCreateView():

Прослушивание ввода EditText

Ознакомьтесь с заметками об основных прослушивателях событий, чтобы узнать, как прослушивать изменения в EditText и выполнять действия, когда эти изменения происходят.

Отображение отзыва о плавающей метке

Традиционно EditText скрывает подсказку (описанную выше) после того, как пользователь начинает печатать. Кроме того, разработчик должен был обрабатывать любые сообщения об ошибках проверки вручную.

Начиная с Android M и библиотекой поддержки дизайна, TextInputLayout можно использовать для настройки плавающей метки для отображения подсказок и сообщений об ошибках. Сначала оберните EditText в TextInputLayout :

Теперь подсказка автоматически начнет плавать, как только EditText получит фокус, как показано ниже:

Мы также можем использовать TextInputLayout для отображения сообщений об ошибках, используя свойства setError и setErrorEnabled в действии во время выполнения:

Здесь мы используем addTextChangedListener для наблюдения за изменением значения, чтобы определить, когда отображать сообщение об ошибке или вернуться к подсказке.

Добавление подсчета символов

TextInputLayout может отображать счетчик символов для определенного в нем EditText. Счетчик будет отображаться ниже EditText и может изменить цвет как строки, так и счетчика символов, если превышено максимальное количество символов:


TextInputLayout просто необходимо определить app:counterEnabled и app:CounterMaxLength в атрибутах XML. Эти параметры также можно определить динамически с помощью setCounterEnabled() и setCounterMaxLength():

Добавление переключателей видимости пароля


Если вы используете EditText с типом ввода пароля, вы также можете включить значок, который может отображать или скрывать весь текст, используя атрибут passwordToggleEnabled. Вы также можете изменить значок глаза по умолчанию с помощью атрибута passwordToggleDrawable или цветовую подсказку с помощью атрибута passwordToggleTint. Дополнительные сведения см. в атрибутах TextInputLayout.

Стиль TextInputLayout

Убедитесь, что во внешнем макете определено пространство имен приложения ( xmlns:app="http://schemas.android.com/apk/res-auto". Вы можете ввести appNS в качестве ярлыка в Android Studio, чтобы объявлено.

Текст подсказки можно оформить, определив app:hintTextAppearance , а текст ошибки можно изменить с помощью app:errorTextAppearance. Текст счетчика и текст переполнения также могут иметь свои собственные стили текста, определяя app:counterTextAppearance и app:counterOverflowTextAppearance . Мы можем использовать textColor , textSize и fontFamily, чтобы изменить цвет, размер или шрифт (поместите их в файл styles.xml):

Автозаполнение

Пошаговые инструкции по настройке автозаполнения для записи см. в официальном руководстве по текстовым полям.

Чтобы управлять поведением maxLength в LengthLimitingTextInputFormatter , используйте maxLengthEnforcement вместо устаревшего maxLengthEnforced .

Контекст

Параметр maxLengthEnforced использовался, чтобы решить, должны ли текстовые поля обрезать входное значение, когда оно достигает предела maxLength, или следует ли вместо этого (для TextField и TextFormField ) показывать предупреждающее сообщение в подсчете символов, когда длина пользовательского вход превысил maxLength .

Однако для ввода символов CJK некоторые методы ввода требуют, чтобы пользователь ввел последовательность латинских символов в текстовое поле, а затем преобразовал эту последовательность в нужные символы CJK (так называемая композиция текста). ). Латинская последовательность обычно длиннее, чем результирующие символы CJK, поэтому установка жесткого максимального ограничения на количество символов в текстовом поле может означать, что пользователь не сможет нормально завершить композицию текста из-за ограничения maxLength на количество символов.

Композиция текста также используется некоторыми методами ввода, чтобы указать, что текст в выделенной области композиции активно редактируется, даже при вводе латинских символов. Например, английская клавиатура Gboard на Android (как и многие другие методы ввода на Android) помещает текущее слово в область ввода.

Чтобы улучшить ввод данных в этих сценариях, было введено новое перечисление с тремя состояниями, MaxLengthEnforcement . Его значения описывают поддерживаемые стратегии обработки активных областей композиции при применении LengthLimitingTextInutFormatter . Новый параметр maxLengthEnforcement, использующий это перечисление, был добавлен в текстовые поля, чтобы заменить логический параметр maxLengthEnforced. С помощью нового параметра enum разработчики могут выбирать различные стратегии в зависимости от типа содержимого, ожидаемого текстовым полем.

Дополнительную информацию см. в документации по maxLength и MaxLengthEnforcement .

Значение параметра maxLengthEnforcement по умолчанию выводится из TargetPlatform приложения, чтобы соответствовать соглашениям платформы:

Описание изменения

  • Добавлен параметр maxLengthEnforcement с использованием нового типа перечисления MaxLengthEnforcement в качестве замены устаревшего логического параметра maxLengthEnforced в классах TextField , TextFormField , CupertinoTextField и LengthLimitingTextInputFormatter.

Руководство по миграции

Рекомендуется использовать поведение по умолчанию для текущей платформы, так как это поведение наиболее знакомо пользователю.

Значения maxLengthEnforcement по умолчанию

  • Android, Windows: MaxLengthEnforcement.enforced . Применяется собственное поведение этих платформ. Вводимое значение будет усечено независимо от того, вводит ли пользователь состав или нет.
  • iOS, MacOS: MaxLengthEnforcement.truncateAfterCompositionEnds . Эти платформы не имеют функции «максимальной длины» и поэтому требуют, чтобы разработчики сами реализовывали поведение. Похоже, что на этих платформах не возникло никаких стандартных соглашений. Мы решили разрешить композиции превышать максимальную длину, чтобы не нарушить ввод CJK.
  • Интернет и Linux: MaxLengthEnforcement.truncateAfterCompositionEnds . Хотя на этих платформах нет стандарта (и существует множество реализаций с конфликтующим поведением), общее соглашение, по-видимому, заключается в том, чтобы позволить композиции превышать максимальную длину по умолчанию.
  • Пурпурный: MaxLengthEnforcement.truncateAfterCompositionEnds . На этой платформе пока нет соглашения о платформе, поэтому мы выбрали соглашение по умолчанию, которое с наименьшей вероятностью приведет к потере данных.

Для постоянного применения ограничения

Чтобы применить ограничение, которое всегда усекает значение, когда оно достигает предела (например, при вводе кода подтверждения), используйте MaxLengthEnforcement.enforced в редактируемых текстовых полях.

Этот параметр может привести к неоптимальному взаимодействию с пользователем при использовании методов ввода, основанных на композиции текста. Рассмотрите возможность использования параметра truncateAfterCompositionEnds, когда текстовое поле ожидает произвольного ввода пользователем, который может содержать символы CJK. Дополнительные сведения см. в разделе "Контекст".

Здравствуйте и добро пожаловать в еще одно руководство от Codingdemos. В этом руководстве вы узнаете, как использовать Android TextInputLayout для отображения количества символов в реальном времени и как установить максимальное количество символов для TextInputEditText в Android.

К концу этого руководства у вас будет примерно такое приложение. (Большой предварительный просмотр)

В этом уроке мы будем использовать следующее:

    – Android Studio версии 3.0
    – Эмулятор Android Nexus 5 с API 26
    – Минимум SDK API 16

1- Откройте Android Studio, создайте новый проект и дайте ему имя, в нашем случае мы назвали его (EditTextLimit), выберите API 16 в качестве минимального SDK, затем выберите пустое действие, нажмите «Готово». и подождите, пока Android Studio создаст ваш проект.

 Экран приветствия Android Studio

Создайте новый проект Android Studio. (Большой предварительный просмотр)

2- Откройте файл colors.xml, чтобы изменить основные цвета приложения.

Примечание. Позже вы будете использовать (colorRed) в качестве индикатора предупреждения для TextInputEditText в Android.

3. Соберите и запустите приложение, чтобы увидеть новые цвета.

Изменены основные цвета приложения. (Большой предварительный просмотр)

4- Откройте файл styles.xml, чтобы добавить следующие стили. Эти стили будут использоваться для настройки внешнего вида Android TextInputLayout.

5- Откройте файл activity_main.xml, сюда вам нужно будет добавить первый Android TextInputLayout.

6- Затем вам нужно показать счетчик, который будет подсчитывать количество символов при вводе и отображать его под TextInputLayout, поэтому добавьте этот атрибут app:counterEnabled="true" внутри TextInputLayout.

7- Создайте и запустите приложение, чтобы увидеть прогресс.

Android TextInputLayout со счетчиком. (Большой предварительный просмотр)

Примечание. Вы сами выбираете максимальное значение, которое хотите, но в этом руководстве мы используем 30.

9- Соберите и запустите приложение, чтобы увидеть TextInputLayout, показывающий максимальное количество символов рядом со счетчиком.

Android TextInputLayout максимальной длины. (Большой предварительный просмотр)

10- Теперь, если вы заметили, что когда количество символов превышает максимальное значение (30), цвет изменится на фиолетовый, давайте изменим это с помощью этого атрибута app:counterOverflowTextAppearance="@style/TextLimitError", который будет ссылаться на один стилей, которые вы создали ранее.

11. Соберите и запустите приложение, чтобы увидеть разницу.

Android TextInputLayout стиль

Android TextInputLayout без стиля и со стилем. (Большой предварительный просмотр)

12- Теперь вы закончили работу над первым Android TextInputLayout, теперь вам нужно добавить второй макет под ним. Единственная разница между ними заключается в используемом стиле и атрибуте максимальной длины Android. Этот атрибут используется для предотвращения превышения ограничения на количество символов (30).

13 – Приложение готово. Соберите и запустите его, чтобы увидеть окончательный результат.

Счетчик Android TextInputLayout с ограничением по количеству символов. (Большой предварительный просмотр)

14- Исходный код этого руководства доступен на GitHub. Я надеюсь, что это руководство окажется вам полезным, и если у вас есть какие-либо вопросы, задайте их в комментариях ниже.

Читайте также: