InputType — to atrybut Androida określający charakter wprowadzanych danych i zachowanie klawiatury dla pól tekstowych. Wartość InputType reprezentuje maskę bitową, która łączy klasę wprowadzania (tekst, liczba, telefon, data) i modyfikatory (wieloliniowość, autokorekta, wielkie litery, ukryte wprowadzanie). InputType wpływa na typ wyświetlanej klawiatury, filtrowanie wprowadzanych znaków i działanie autouzupełniania. Według Android Developers (2026), InputType jest jednym z najważniejszych atrybutów zapewniających poprawne wprowadzanie danych i powinien być jawnie ustawiony dla każdego edytowalnego pola tekstowego.
Najważniejsze
InputType — to stała całkowitoliczbowa (Int), która koduje tryb wprowadzania dla pola tekstowego. W Androidzie jest zdefiniowana w klasie android.text.InputType. Wartość InputType składa się z dwóch części: klasy wprowadzania (bity 0–4) i modyfikatorów (bity 5–31). Klasa wprowadzania określa podstawowy typ danych — tekst, liczba, telefon, data. Modyfikatory określają zachowanie w ramach wybranej klasy — na przykład dla klasy tekstowej można włączyć autokorektę, wielkie litery lub wprowadzanie wieloliniowe.
Mechanizm InputType działa na trzech poziomach: na poziomie frameworka Androida określa, który InputConnection zostanie utworzony (połączenie między EditText a IME); na poziomie IME (klawiatury) wskazuje, które znaki pokazywać i jak przetwarzać wprowadzanie; na poziomie aplikacji filtruje znaki przez InputFilter wbudowany w EditText. Według Android Source Code (AOSP, 2026), maska bitowa jest przetwarzana w metodzie TextView.getInputType(), która zwraca bieżącą wartość, oraz setInputType(), która rekonfiguruje wewnętrzne filtry i połączenie z IME.
Ważna cecha InputType — nie można go odczytać z innego procesu ze względów bezpieczeństwa. Zapobiega to kradzieży danych poprzez dostęp do typu wprowadzania (na przykład określenie, czy pole jest hasłem). Przy próbie odczytu InputType z innej aplikacji zwracane jest TYPE_CLASS_TEXT domyślnie.
// Podstawowe stałe 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
// Maska do wyodrębniania klasy
InputType.TYPE_MASK_CLASS // 0x0000000F
W Androidzie zdefiniowano cztery podstawowe klasy InputType. Każda klasa odpowiada określonej kategorii danych i aktywuje odpowiedni typ klawiatury. Klasa jest wskazywana w bitach 0–4 maski bitowej i może być wyodrębniona przez maskę TYPE_MASK_CLASS (0x0F).
| Klasa | Stała | Klawiatura | Zastosowanie |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | QWERTY | Tekst, komentarze, opis |
| NUMBER | TYPE_CLASS_NUMBER (2) | Numeryczna | Ilość, cena, wiek |
| PHONE | TYPE_CLASS_PHONE (3) | Telefoniczna | Numer telefonu |
| DATETIME | TYPE_CLASS_DATETIME (4) | Data/godzina | Data, godzina |
TYPE_CLASS_DATETIME jest rzadko używany bezpośrednio — zazwyczaj do wprowadzania daty stosuje się DatePicker lub DatePickerDialog, a nie pole tekstowe. Jednak w niektórych scenariuszach (szybkie ręczne wprowadzanie daty) ta klasa może być przydatna. Nie ma ona specjalistycznej klawiatury i zazwyczaj wyświetla klawiaturę numeryczną.
Każda klasa wprowadzania może być łączona z wariacjami (variation) — podtypami wskazanymi w bitach 5–7. Na przykład TYPE_TEXT_VARIATION_PASSWORD (bit 5) dodaje do klasy TEXT ukryte wprowadzanie. Bity wariacji: 0x000000E0 (maska TYPE_MASK_VARIATION).
Flagi-modyfikatory InputType (bity 8–31) dodają dodatkowe możliwości do podstawowej klasy. Nie zmieniają one typu klawiatury, ale modyfikują zachowanie wprowadzania. Flagii są specyficzne dla każdej klasy — flagi dla TEXT nie działają z NUMBER i odwrotnie. Poniżej wymieniono główne modyfikatory dla każdej klasy.
Według Android Developers Documentation (2026), flagi dla różnych klas nie nakładają się — próba użycia flagi TEXT z NUMBER zostanie zignorowana. Do sprawdzenia ustawionej flagi używa się bitowego AND: (inputType and FLAG) != 0.
Prawidłowa kombinacja InputType z klasami i flagami to klucz do tworzenia wygodnych formularzy. Rozważmy typowe scenariusze i odpowiadające im konfiguracje InputType. Każdy scenariusz optymalizuje wprowadzanie dla konkretnego typu danych, czyniąc formularz intuicyjnym i przyspieszając jego wypełnianie.
| Scenariusz | InputType | Klawiatura |
|---|---|---|
| Imię | textCapWords | QWERTY, każde słowo z wielkiej litery |
| textEmailAddress | QWERTY z @ i . | |
| Hasło | textPassword | QWERTY, ukryte wprowadzanie |
| Telefon | phone | Cyfry z +, #, * |
| Cena | numberDecimal | Cyfry z przecinkiem |
| Ilość | number | Tylko cyfry |
| Komentarz | textCapSentences|textMultiLine | QWERTY, wieloliniowy |
| Szukaj | text|textNoSuggestions | QWERTY bez podpowiedzi |
// Kombinacja dla pola ceny
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// Kombinacja dla pola komentarza
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
Ustawienie InputType programowo przez setInputType() nadpisuje poprzednią wartość. Jeśli trzeba zmienić tylko część maski (na przykład dodać flagę), należy zachować bieżącą wartość, zmienić ją i zastosować ponownie. Każde wywołanie setInputType() rekonfiguruje wewnętrzne filtry EditText.
Metoda setRawInputType() różni się od setInputType tym, że nie powoduje rekonfiguracji filtrów i podpowiedzi. Jest używana do tymczasowej zmiany InputType bez pełnego przeładowania stanu EditText. Po wywołaniu setInputType() zaleca się ponowne uruchomienie IME, aby klawiatura została zaktualizowana.
// Przełączanie między hasłem a widocznym tekstem
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
}
// Zachowaj pozycję kursora
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// Pobierz klasę wprowadzania
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// Pobierz wariację wprowadzania
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// Sprawdź, czy pole hasła
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
Prawidłowy wybór InputType to nie tylko UX, ale także bezpieczeństwo i poprawność danych. Główne zalecenia obejmują: zawsze określać jawny InputType dla każdego EditText; używać najbardziej konkretnej klasy wprowadzania; nie łączyć flag z różnych klas; dla pól z wrażliwymi danymi używać wariacji PASSWORD; dla pól wyszukiwania używać imeOptions=„actionSearch”.
InputType wpływa również na działanie usług ułatwień dostępu (Accessibility). Pola z typem textPassword otrzymują dodatkową ochronę przed czytnikami ekranu — nie odczytują one wprowadzanych znaków na głos. Dla pól z textEmailAddress Screen Reader informuje użytkownika, że pole jest przeznaczone do email, i oferuje odpowiednie podpowiedzi.
Według Material Design Guidelines (2025), InputType powinien odpowiadać typowi danych wprowadzanych przez użytkownika. Nieprawidłowy InputType nie tylko spowalnia wprowadzanie, ale może również prowadzić do błędów: na przykład, jeśli do wprowadzania numeru telefonu pozostawić textMultiLine, klawiatura nie pokaże bloku numerycznego, a użytkownik będzie zmuszony ręcznie przełączać układ za każdym razem.
Często zadawane pytania
InputType — to atrybut EditText, który określa typ wprowadzanych danych przez maskę bitową. Keyboard Type — to nieoficjalna nazwa wizualnego typu klawiatury, który jest aktywowany przez InputType. InputType wpływa również na filtrowanie znaków, autokorektę i autouzupełnianie, a nie tylko na układ klawiatury.
Ustaw editText.inputType = InputType.TYPE_CLASS_TEXT lub użyj stałej InputType.TYPE_NULL (0x00000000) do całkowitego resetu. Przy TYPE_NULL pole nie będzie pokazywać klawiatury po focusie. Aby powrócić do standardowego wprowadzania tekstu, ustaw TYPE_CLASS_TEXT bez flag.
Nie można utworzyć nowej klasy InputType, ponieważ jest ona częścią frameworka Android. Można jednak łączyć istniejące klasy i flagi, aby osiągnąć pożądane zachowanie. Dodatkową filtrację znaków zaimplementuj przez InputFilter, który ustawia się na EditText za pomocą metody setFilters().
InputType jest przekazywany do systemu wprowadzania przez InputConnection. IME odczytuje klasę i wariację InputType i wybiera odpowiedni układ klawiatury. Na przykład TYPE_CLASS_NUMBER z TYPE_NUMBER_FLAG_DECIMAL powoduje, że klawiatura pokazuje blok numeryczny z przecinkiem. Większość nowoczesnych klawiatur stosuje się do tych zaleceń.
Użyj właściwości editText.inputType w Kotlin lub editText.getInputType() w Javie. Do wyodrębnienia klasy zastosuj maskę: inputType and InputType.TYPE_MASK_CLASS. Do sprawdzenia konkretnej flagi: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — jeśli wynik != 0, flaga jest ustawiona.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również