InputType — что это, атрибуты ввода и их настройка в Android

Автор: IT Sectr Опубликовано: 2026-07-07 Время чтения: 9 мин

InputType — это атрибут Android, определяющий характер вводимых данных и поведение клавиатуры для текстовых полей. Значение InputType представляет собой битовую маску, которая комбинирует класс ввода (текст, число, телефон, дата) и модификаторы (многострочность, автозамена, заглавные буквы, скрытый ввод). InputType влияет на тип отображаемой клавиатуры, фильтрацию вводимых символов и работу автозаполнения. По данным Android Developers (2026), InputType является одним из наиболее важных атрибутов для обеспечения корректного ввода данных и должен быть явно задан для каждого редактируемого текстового поля.

Главное

  • InputType — битовая маска, определяющая класс ввода и модификаторы для EditText.
  • Классы ввода — TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME.
  • Модификаторы — флаги, уточняющие поведение: MULTI_LINE, AUTO_CORRECT, PASSWORD, CAP_SENTENCES.
  • Комбинирование — класс и модификаторы объединяются через побитовое OR для точной конфигурации.
  • Влияние — правильный InputType ускоряет ввод, снижает ошибки и улучшает UX формы.

Что такое InputType в Android

InputType — это целочисленная константа (Int), которая кодирует режим ввода для текстового поля. В Android она определена в классе android.text.InputType. Значение InputType состоит из двух частей: класс ввода (биты 0–4) и модификаторы (биты 5–31). Класс ввода определяет базовый тип данных — текст, число, телефон, дата. Модификаторы уточняют поведение внутри выбранного класса — например, для текстового класса можно включить автозамену, заглавные буквы или многострочность.

Механизм InputType работает на трёх уровнях: на уровне фреймворка Android он определяет, какой InputConnection будет создан (связь между EditText и IME); на уровне IME (клавиатуры) он указывает, какие символы показывать и как обрабатывать ввод; на уровне приложения он фильтрует символы через InputFilter, встроенный в EditText. По данным Android Source Code (AOSP, 2026), битовая маска обрабатывается в методе TextView.getInputType(), который возвращает текущее значение, и setInputType(), который переконфигурирует внутренние фильтры и связь с IME.

Важная особенность InputType — его нельзя прочитать из другого процесса из соображений безопасности. Это предотвращает кражу данных через доступ к типу ввода (например, определение, является ли поле паролем). При попытке чтения InputType из другого приложения возвращается TYPE_CLASS_TEXT по умолчанию.

kotlin
// Basic InputType constants
InputType.TYPE_CLASS_TEXT       // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER     // 0x0002 = 2
InputType.TYPE_CLASS_PHONE      // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME   // 0x0004 = 4

// Mask for extracting class
InputType.TYPE_MASK_CLASS       // 0x0000000F

Классы InputType: TEXT, NUMBER, PHONE, DATETIME

В Android определены четыре базовых класса InputType. Каждый класс соответствует определённой категории данных и активирует соответствующий тип клавиатуры. Класс указывается в битах 0–4 битовой маски и может быть извлечён через маску TYPE_MASK_CLASS (0x0F).

КлассКонстантаКлавиатураПрименение
TEXTTYPE_CLASS_TEXT (1)QWERTY-клавиатураТекст, комментарии, описание
NUMBERTYPE_CLASS_NUMBER (2)ЦифроваяКоличество, цена, возраст
PHONETYPE_CLASS_PHONE (3)ТелефоннаяНомер телефона
DATETIMETYPE_CLASS_DATETIME (4)Дата/времяДата, время

TYPE_CLASS_DATETIME используется редко напрямую — обычно для ввода даты применяются DatePicker или DatePickerDialog, а не текстовое поле. Однако в некоторых сценариях (быстрый ввод даты вручную) этот класс может быть полезен. Он не имеет специализированной клавиатуры и обычно отображает цифровую клавиатуру.

Каждый класс ввода может быть скомбинирован с вариациями (variation) — подтипами, указанными в битах 5–7. Например, TYPE_TEXT_VARIATION_PASSWORD (бит 5) добавляет к классу TEXT скрытый ввод. Биты вариации: 0x000000E0 (маска TYPE_MASK_VARIATION).

Флаги-модификаторы InputType

Флаги-модификаторы InputType (биты 8–31) добавляют дополнительные возможности к базовому классу. Они не меняют тип клавиатуры, но изменяют поведение ввода. Флаги специфичны для каждого класса — флаги для TEXT не работают с NUMBER, и наоборот. Ниже перечислены основные модификаторы для каждого класса.

Флаги для TEXT

  • TYPE_TEXT_FLAG_CAP_CHARACTERS — все буквы заглавные.
  • TYPE_TEXT_FLAG_CAP_WORDS — каждое слово с заглавной буквы.
  • TYPE_TEXT_FLAG_CAP_SENTENCES — заглавная буква в начале предложения (по умолчанию).
  • TYPE_TEXT_FLAG_AUTO_CORRECT — автоматическое исправление опечаток.
  • TYPE_TEXT_FLAG_AUTO_COMPLETE — автодополнение (для AutoCompleteTextView).
  • TYPE_TEXT_FLAG_MULTI_LINE — многострочный ввод.
  • TYPE_TEXT_FLAG_NO_SUGGESTIONS — отключение подсказок.

Флаги для NUMBER

  • TYPE_NUMBER_FLAG_SIGNED — разрешает отрицательные числа (знак минуса).
  • TYPE_NUMBER_FLAG_DECIMAL — разрешает десятичную точку.

По данным Android Developers Documentation (2026), флаги для разных классов не пересекаются — попытка использовать TEXT-флаг с NUMBER будет проигнорирована. Для проверки установленного флага используется побитовое AND: (inputType and FLAG) != 0.

Комбинации InputType: примеры для разных сценариев

Правильная комбинация InputType с классами и флагами — ключ к созданию удобных форм. Рассмотрим типичные сценарии и соответствующие конфигурации InputType. Каждый сценарий оптимизирует ввод для конкретного типа данных, делая форму интуитивно понятной и ускоряя заполнение.

СценарийInputTypeКлавиатура
ИмяtextCapWordsQWERTY, каждое слово с заглавной
EmailtextEmailAddressQWERTY с @ и .
ПарольtextPasswordQWERTY, скрытый ввод
ТелефонphoneЦифры с +, #, *
ЦенаnumberDecimalЦифры с запятой
КоличествоnumberТолько цифры
КомментарийtextCapSentences|textMultiLineQWERTY, многострочный
Поискtext|textNoSuggestionsQWERTY без подсказок
kotlin
// Combination for price field
editText.inputType = InputType.TYPE_CLASS_NUMBER or
    InputType.TYPE_NUMBER_FLAG_DECIMAL

// Combination for comment field
editText.inputType = InputType.TYPE_CLASS_TEXT or
    InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
    InputType.TYPE_TEXT_FLAG_MULTI_LINE

Программная работа с InputType

Установка InputType программно через setInputType() перезаписывает предыдущее значение. Если нужно изменить только часть маски (например, добавить флаг), необходимо сохранить текущее значение, изменить его и применить обратно. Каждый вызов setInputType() переконфигурирует внутренние фильтры EditText.

Метод setRawInputType() отличаяется от setInputType тем, что не вызывает переконфигурацию фильтров и подсказок. Он используется для временного изменения InputType без полной перезагрузки состояния EditText. После вызова setInputType() рекомендуется перезапустить IME, чтобы клавиатура обновилась.

Переключение режимов

kotlin
// Toggle between password and visible text
fun togglePasswordVisibility(editText: EditText) {
    val currentType = editText.inputType
    val isPassword = (currentType and
        InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0

    editText.inputType = if (isPassword) {
        InputType.TYPE_CLASS_TEXT or
            InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
    } else {
        InputType.TYPE_CLASS_TEXT or
            InputType.TYPE_TEXT_VARIATION_PASSWORD
    }

    // Keep cursor position
    val cursorPos = editText.selectionStart
    editText.setSelection(cursorPos)
}

Извлечение класса и вариации

kotlin
// Get input class
fun getInputClass(inputType: Int): Int {
    return inputType and InputType.TYPE_MASK_CLASS
}

// Get input variation
fun getInputVariation(inputType: Int): Int {
    return inputType and InputType.TYPE_MASK_VARIATION
}

// Check if password field
fun isPasswordField(editText: EditText): Boolean {
    return (editText.inputType and
        InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}

Лучшие практики выбора InputType

Правильный выбор InputType — это не только UX, но и безопасность и корректность данных. Основные рекомендации включают: всегда указывать явный InputType для каждого EditText; использовать максимально конкретный класс ввода; не комбинировать флаги из разных классов; для полей с чувствительными данными использовать вариации PASSWORD; для полей поиска использовать imeOptions="actionSearch".

InputType также влияет на работу служб специальных возможностей (Accessibility). Поля с типом textPassword получают дополнительную защиту от экранных дикторов — они не зачитывают вводимые символы вслух. Для полей с textEmailAddress Screen Reader сообщает пользователю, что поле предназначено для email, и предлагает соответствующие подсказки.

  • Явность — всегда явно задавай InputType, не полагайся на значение по умолчанию (textMultiLine).
  • Специфичность — используй наиболее конкретный тип: textEmailAddress, а не text для email.
  • Безопасность — для паролей, PIN и данных карт используй вариации PASSWORD.
  • Автозаполнение — комбинируй InputType с autofillHints для поддержки менеджеров паролей.
  • Тестирование — проверяй поведение на разных клавиатурах (Gboard, SwiftKey, Samsung Keyboard).

По данным Material Design Guidelines (2025), InputType должен соответствовать типу данных, которые пользователь вводит. Неправильный InputType не только замедляет ввод, но и может привести к ошибкам: например, если для ввода телефонного номера оставить textMultiLine, клавиатура не покажет цифровой блок, и пользователь будет вынужден переключать раскладку вручную каждый раз.

Часто задаваемые вопросы

Чем InputType отличается от Keyboard Type?

InputType — это атрибут EditText, который определяет тип вводимых данных через битовую маску. Keyboard Type — это неофициальное название для визуального типа клавиатуры, который активируется InputType. InputType также влияет на фильтрацию символов, автозамену и автодополнение, а не только на раскладку клавиатуры.

Как сбросить InputType к значению по умолчанию?

Установи editText.inputType = InputType.TYPE_CLASS_TEXT или используй константу InputType.TYPE_NULL (0x00000000) для полного сброса. При TYPE_NULL поле не будет показывать клавиатуру при фокусе. Для возврата к стандартному текстовому вводу установи TYPE_CLASS_TEXT без флагов.

Можно ли создать кастомный InputType?

Нельзя создать новый класс InputType, так как он часть Android framework. Однако можно комбинировать существующие классы и флаги для достижения нужного поведения. Дополнительную фильтрацию символов реализуй через InputFilter, который устанавливается на EditText через метод setFilters().

Как InputType влияет на IME (клавиатуру)?

InputType передаётся системе ввода через InputConnection. IME читает класс и вариацию InputType и выбирает соответствующую раскладку клавиатуры. Например, TYPE_CLASS_NUMBER с TYPE_NUMBER_FLAG_DECIMAL заставляет клавиатуру показывать цифровой блок с точкой. Большинство современных клавиатур следуют этим рекомендациям.

Как проверить InputType в runtime?

Используй свойство editText.inputType в Kotlin или editText.getInputType() в Java. Для извлечения класса примени маску: inputType and InputType.TYPE_MASK_CLASS. Для проверки конкретного флага: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — если результат != 0, флаг установлен.

Итоги

  • InputType — битовая маска, состоящая из класса ввода (TEXT, NUMBER, PHONE, DATETIME) и модификаторов.
  • Класс ввода определяет базовый тип данных и тип отображаемой клавиатуры.
  • Модификаторы уточняют поведение: многострочность, автозамена, заглавные буквы, скрытый ввод.
  • Комбинирование через побитовое OR позволяет создавать точные конфигурации для разных сценариев.
  • Вариации PASSWORD отключают автозамену, скрывают символы и предотвращают запись в словарь.
  • Программная установка через setInputType() требует перезапуска IME для обновления клавиатуры.
  • Лучшие практики — явно задавай InputType, используй конкретные типы и тестируй на разных клавиатурах.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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