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 за замовчуванням.
// Базові константи InputType
InputType.TYPE_CLASS_TEXT // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER // 0x0002 = 2
InputType.TYPE_CLASS_PHONE // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME // 0x0004 = 4
// Маска для витягнення класу
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, а не текстове поле. Однак у деяких сценаріях (швидке ручне введення дати) цей клас може бути корисним. Він не має спеціалізованої клавіатури і зазвичай відображає цифрову клавіатуру.
Кожен клас введення може бути скомбінований з варіаціями — підтипами, вказаними в бітах 5–7. Наприклад, TYPE_TEXT_VARIATION_PASSWORD (біт 5) додає до класу TEXT приховане введення. Біти варіації: 0x000000E0 (маска TYPE_MASK_VARIATION).
Прапорці-модифікатори InputType (біти 8–31) додають додаткові можливості до базового класу. Вони не змінюють тип клавіатури, але змінюють поведінку введення. Прапорці специфічні для кожного класу — прапорці для TEXT не працюють з NUMBER, і навпаки. Нижче перераховано основні модифікатори для кожного класу.
Згідно з Android Developers Documentation (2026), прапорці для різних класів не перетинаються — спроба використати TEXT-прапорець з NUMBER буде проігнорована. Для перевірки встановленого прапорця використовується побітове І: (inputType and FLAG) != 0.
Правильна комбінація класів і прапорців InputType — ключ до створення зручних форм. Розглянемо типові сценарії та відповідні конфігурації InputType. Кожен сценарій оптимізує введення для конкретного типу даних, роблячи форму інтуїтивно зрозумілою та прискорюючи заповнення.
| Сценарій | InputType | Клавіатура |
|---|---|---|
| Ім'я | textCapWords | QWERTY, кожне слово з великої |
| textEmailAddress | QWERTY з @ та . | |
| Пароль | textPassword | QWERTY, приховане введення |
| Телефон | phone | Цифри з +, #, * |
| Ціна | numberDecimal | Цифри з десятковою крапкою |
| Кількість | number | Тільки цифри |
| Коментар | textCapSentences|textMultiLine | QWERTY, багаторядковий |
| Пошук | text|textNoSuggestions | QWERTY без підказок |
// Комбінація для поля ціни
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// Комбінація для поля коментаря
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, щоб клавіатура оновилася.
// Перемикання між паролем і видимим текстом
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
}
// Зберегти позицію курсора
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// Отримати клас введення
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// Отримати варіацію введення
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// Перевірити, чи є поле паролем
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 екранний диктор повідомляє користувачеві, що поле призначене для 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також