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, а не текстово поле. Въпреки това, в някои сценарии (бързо ръчно въвеждане на дата) този клас може да бъде полезен. Той няма специализирана клавиатура и обикновено показва цифрова клавиатура.
Всеки клас на въвеждане може да бъде комбиниран с вариации (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 без предложения |
// Комбинация за поле за цена
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, Screen Reader информира потребителя, че полето е предназначено за имейл, и предлага подходящи предложения.
Според 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 рамката. Въпреки това, можете да комбинирате съществуващи класове и флагове, за да постигнете желаното поведение. Допълнително филтриране на символи реализирайте чрез 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също