InputType — это атрибут Android, определяющий характер вводимых данных и поведение клавиатуры для текстовых полей. Значение InputType представляет собой битовую маску, которая комбинирует класс ввода (текст, число, телефон, дата) и модификаторы (многострочность, автозамена, заглавные буквы, скрытый ввод). InputType влияет на тип отображаемой клавиатуры, фильтрацию вводимых символов и работу автозаполнения. По данным Android Developers (2026), InputType является одним из наиболее важных атрибутов для обеспечения корректного ввода данных и должен быть явно задан для каждого редактируемого текстового поля.
Главное
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 по умолчанию.
// 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
В Android определены четыре базовых класса InputType. Каждый класс соответствует определённой категории данных и активирует соответствующий тип клавиатуры. Класс указывается в битах 0–4 битовой маски и может быть извлечён через маску TYPE_MASK_CLASS (0x0F).
| Класс | Константа | Клавиатура | Применение |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | QWERTY-клавиатура | Текст, комментарии, описание |
| NUMBER | TYPE_CLASS_NUMBER (2) | Цифровая | Количество, цена, возраст |
| PHONE | TYPE_CLASS_PHONE (3) | Телефонная | Номер телефона |
| DATETIME | TYPE_CLASS_DATETIME (4) | Дата/время | Дата, время |
TYPE_CLASS_DATETIME используется редко напрямую — обычно для ввода даты применяются DatePicker или DatePickerDialog, а не текстовое поле. Однако в некоторых сценариях (быстрый ввод даты вручную) этот класс может быть полезен. Он не имеет специализированной клавиатуры и обычно отображает цифровую клавиатуру.
Каждый класс ввода может быть скомбинирован с вариациями (variation) — подтипами, указанными в битах 5–7. Например, TYPE_TEXT_VARIATION_PASSWORD (бит 5) добавляет к классу TEXT скрытый ввод. Биты вариации: 0x000000E0 (маска TYPE_MASK_VARIATION).
Флаги-модификаторы InputType (биты 8–31) добавляют дополнительные возможности к базовому классу. Они не меняют тип клавиатуры, но изменяют поведение ввода. Флаги специфичны для каждого класса — флаги для TEXT не работают с NUMBER, и наоборот. Ниже перечислены основные модификаторы для каждого класса.
По данным Android Developers Documentation (2026), флаги для разных классов не пересекаются — попытка использовать TEXT-флаг с NUMBER будет проигнорирована. Для проверки установленного флага используется побитовое AND: (inputType and FLAG) != 0.
Правильная комбинация InputType с классами и флагами — ключ к созданию удобных форм. Рассмотрим типичные сценарии и соответствующие конфигурации InputType. Каждый сценарий оптимизирует ввод для конкретного типа данных, делая форму интуитивно понятной и ускоряя заполнение.
| Сценарий | InputType | Клавиатура |
|---|---|---|
| Имя | textCapWords | QWERTY, каждое слово с заглавной |
| textEmailAddress | QWERTY с @ и . | |
| Пароль | textPassword | QWERTY, скрытый ввод |
| Телефон | phone | Цифры с +, #, * |
| Цена | numberDecimal | Цифры с запятой |
| Количество | number | Только цифры |
| Комментарий | textCapSentences|textMultiLine | QWERTY, многострочный |
| Поиск | text|textNoSuggestions | QWERTY без подсказок |
// 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 программно через setInputType() перезаписывает предыдущее значение. Если нужно изменить только часть маски (например, добавить флаг), необходимо сохранить текущее значение, изменить его и применить обратно. Каждый вызов setInputType() переконфигурирует внутренние фильтры EditText.
Метод setRawInputType() отличаяется от setInputType тем, что не вызывает переконфигурацию фильтров и подсказок. Он используется для временного изменения InputType без полной перезагрузки состояния EditText. После вызова setInputType() рекомендуется перезапустить IME, чтобы клавиатура обновилась.
// 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)
}
// 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 — это не только UX, но и безопасность и корректность данных. Основные рекомендации включают: всегда указывать явный InputType для каждого EditText; использовать максимально конкретный класс ввода; не комбинировать флаги из разных классов; для полей с чувствительными данными использовать вариации PASSWORD; для полей поиска использовать imeOptions="actionSearch".
InputType также влияет на работу служб специальных возможностей (Accessibility). Поля с типом textPassword получают дополнительную защиту от экранных дикторов — они не зачитывают вводимые символы вслух. Для полей с textEmailAddress Screen Reader сообщает пользователю, что поле предназначено для email, и предлагает соответствующие подсказки.
По данным Material Design Guidelines (2025), InputType должен соответствовать типу данных, которые пользователь вводит. Неправильный InputType не только замедляет ввод, но и может привести к ошибкам: например, если для ввода телефонного номера оставить textMultiLine, клавиатура не покажет цифровой блок, и пользователь будет вынужден переключать раскладку вручную каждый раз.
Часто задаваемые вопросы
InputType — это атрибут EditText, который определяет тип вводимых данных через битовую маску. Keyboard Type — это неофициальное название для визуального типа клавиатуры, который активируется InputType. InputType также влияет на фильтрацию символов, автозамену и автодополнение, а не только на раскладку клавиатуры.
Установи editText.inputType = InputType.TYPE_CLASS_TEXT или используй константу InputType.TYPE_NULL (0x00000000) для полного сброса. При TYPE_NULL поле не будет показывать клавиатуру при фокусе. Для возврата к стандартному текстовому вводу установи TYPE_CLASS_TEXT без флагов.
Нельзя создать новый класс InputType, так как он часть Android framework. Однако можно комбинировать существующие классы и флаги для достижения нужного поведения. Дополнительную фильтрацию символов реализуй через InputFilter, который устанавливается на EditText через метод setFilters().
InputType передаётся системе ввода через InputConnection. IME читает класс и вариацию InputType и выбирает соответствующую раскладку клавиатуры. Например, TYPE_CLASS_NUMBER с TYPE_NUMBER_FLAG_DECIMAL заставляет клавиатуру показывать цифровой блок с точкой. Большинство современных клавиатур следуют этим рекомендациям.
Используй свойство editText.inputType в Kotlin или editText.getInputType() в Java. Для извлечения класса примени маску: inputType and InputType.TYPE_MASK_CLASS. Для проверки конкретного флага: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — если результат != 0, флаг установлен.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также