InputType — co to jest, atrybuty wprowadzania i ich konfiguracja w Androidzie

Autor: IT Sectr Opublikowano: 2026-07-07 Czas czytania: 9 min

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 — maska bitowa określająca klasę wprowadzania i modyfikatory dla EditText.
  • Klasy wprowadzania — TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME.
  • Modyfikatory — flagi określające zachowanie: MULTI_LINE, AUTO_CORRECT, PASSWORD, CAP_SENTENCES.
  • Łączenie — klasa i modyfikatory są łączone przez bitowe OR w celu precyzyjnej konfiguracji.
  • Wpływ — prawidłowy InputType przyspiesza wprowadzanie, zmniejsza liczbę błędów i poprawia UX formularza.

Czym jest InputType w Androidzie

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.

kotlin
// 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

Klasy InputType: TEXT, NUMBER, PHONE, DATETIME

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).

KlasaStałaKlawiaturaZastosowanie
TEXTTYPE_CLASS_TEXT (1)QWERTYTekst, komentarze, opis
NUMBERTYPE_CLASS_NUMBER (2)NumerycznaIlość, cena, wiek
PHONETYPE_CLASS_PHONE (3)TelefonicznaNumer telefonu
DATETIMETYPE_CLASS_DATETIME (4)Data/godzinaData, 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

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.

Flagi dla TEXT

  • TYPE_TEXT_FLAG_CAP_CHARACTERS — wszystkie litery wielkie.
  • TYPE_TEXT_FLAG_CAP_WORDS — każde słowo z wielkiej litery.
  • TYPE_TEXT_FLAG_CAP_SENTENCES — wielka litera na początku zdania (domyślnie).
  • TYPE_TEXT_FLAG_AUTO_CORRECT — automatyczna korekta literówek.
  • TYPE_TEXT_FLAG_AUTO_COMPLETE — autouzupełnianie (dla AutoCompleteTextView).
  • TYPE_TEXT_FLAG_MULTI_LINE — wprowadzanie wieloliniowe.
  • TYPE_TEXT_FLAG_NO_SUGGESTIONS — wyłączenie podpowiedzi.

Flagi dla NUMBER

  • TYPE_NUMBER_FLAG_SIGNED — zezwala na liczby ujemne (znak minusa).
  • TYPE_NUMBER_FLAG_DECIMAL — zezwala na przecinek dziesiętny.

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.

Kombinacje InputType: przykłady dla różnych scenariuszy

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.

ScenariuszInputTypeKlawiatura
ImiętextCapWordsQWERTY, każde słowo z wielkiej litery
EmailtextEmailAddressQWERTY z @ i .
HasłotextPasswordQWERTY, ukryte wprowadzanie
TelefonphoneCyfry z +, #, *
CenanumberDecimalCyfry z przecinkiem
IlośćnumberTylko cyfry
KomentarztextCapSentences|textMultiLineQWERTY, wieloliniowy
Szukajtext|textNoSuggestionsQWERTY bez podpowiedzi
kotlin
// 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

Programowa praca z InputType

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 trybów

kotlin
// 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)
}

Wyodrębnianie klasy i wariacji

kotlin
// 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
}

Najlepsze praktyki wyboru InputType

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.

  • Jawność — zawsze jawnie ustawiaj InputType, nie polegaj na wartości domyślnej (textMultiLine).
  • Specyficzność — używaj najbardziej konkretnego typu: textEmailAddress, a nie text dla email.
  • Bezpieczeństwo — dla haseł, PIN i danych kart używaj wariacji PASSWORD.
  • Autouzupełnianie — łącz InputType z autofillHints dla wsparcia menedżerów haseł.
  • Testowanie — sprawdzaj zachowanie na różnych klawiaturach (Gboard, SwiftKey, Samsung Keyboard).

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

Czym InputType różni się od Keyboard Type?

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.

Jak zresetować InputType do wartości domyślnej?

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.

Czy można utworzyć własny InputType?

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().

Jak InputType wpływa na IME (klawiaturę)?

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ń.

Jak sprawdzić InputType w runtime?

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

  • InputType — maska bitowa składająca się z klasy wprowadzania (TEXT, NUMBER, PHONE, DATETIME) i modyfikatorów.
  • Klasa wprowadzania określa podstawowy typ danych i typ wyświetlanej klawiatury.
  • Modyfikatory określają zachowanie: wieloliniowość, autokorekta, wielkie litery, ukryte wprowadzanie.
  • Łączenie przez bitowe OR pozwala tworzyć precyzyjne konfiguracje dla różnych scenariuszy.
  • Wariacje PASSWORD wyłączają autokorektę, ukrywają znaki i zapobiegają zapisywaniu do słownika.
  • Programowe ustawienie przez setInputType() wymaga ponownego uruchomienia IME w celu aktualizacji klawiatury.
  • Najlepsze praktyki — jawnie ustawiaj InputType, używaj konkretnych typów i testuj na różnych klawiaturach.

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.

Omów projekt

Przeczytaj również