InputType — är ett Android-attribut som bestämmer karaktären på inmatade data och tangentbordsbeteende för textfält. Värdet InputType representerar en bitmask som kombinerar inmatningsklass (text, nummer, telefon, datum) och modifierare (flerradig, automatisk korrigering, versaler, dold inmatning). InputType påverkar typen av visat tangentbord, filtrering av inmatade tecken och funktionen för automatisk komplettering. Enligt Android Developers (2026) är InputType en av de viktigaste attributen för att säkerställa korrekt datainmatning och bör uttryckligen anges för varje redigerbart textfält.
Huvudpunkter
InputType — är en heltalskonstant (Int) som kodar inmatningsläget för ett textfält. I Android definieras den i klassen android.text.InputType. Värdet InputType består av två delar: inmatningsklass (bitar 0–4) och modifierare (bitar 5–31). Inmatningsklassen bestämmer grundläggande datatyp — text, nummer, telefon, datum. Modifierare specificerar beteendet inom den valda klassen — till exempel för textklassen kan automatisk korrigering, versaler eller flerradig inmatning aktiveras.
InputType-mekanismen fungerar på tre nivåer: på Android-ramverkets nivå bestämmer den vilken InputConnection som skapas (anslutning mellan EditText och IME); på IME-nivå (tangentbord) anger den vilka tecken som ska visas och hur inmatning ska behandlas; på applikationsnivå filtrerar den tecken via InputFilter inbyggd i EditText. Enligt Android Source Code (AOSP, 2026) bearbetas bitmasken i metoden TextView.getInputType(), som returnerar aktuellt värde, och setInputType(), som omkonfigurerar interna filter och anslutning till IME.
En viktig egenskap hos InputType — den kan inte läsas från en annan process av säkerhetsskäl. Detta förhindrar datastöld via åtkomst till inmatningstyp (till exempel att avgöra om ett fält är ett lösenord). Vid försök att läsa InputType från en annan applikation returneras TYPE_CLASS_TEXT som standard.
// Grundläggande InputType-konstanter
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 för att extrahera klass
InputType.TYPE_MASK_CLASS // 0x0000000F
I Android definieras fyra grundläggande InputType-klasser. Varje klass motsvarar en specifik datakategori och aktiverar motsvarande tangentbordstyp. Klassen anges i bitar 0–4 i bitmasken och kan extraheras via masken TYPE_MASK_CLASS (0x0F).
| Klass | Konstant | Tangentbord | Användning |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | QWERTY | Text, kommentarer, beskrivning |
| NUMBER | TYPE_CLASS_NUMBER (2) | Numeriskt | Kvantitet, pris, ålder |
| PHONE | TYPE_CLASS_PHONE (3) | Telefon | Telefonnummer |
| DATETIME | TYPE_CLASS_DATETIME (4) | Datum/tid | Datum, tid |
TYPE_CLASS_DATETIME används sällan direkt — vanligtvis för datum inmatning används DatePicker eller DatePickerDialog, inte ett textfält. Men i vissa scenarier (snabb manuell datum inmatning) kan denna klass vara användbar. Den har inget specialiserat tangentbord och visar vanligtvis ett numeriskt tangentbord.
Varje inmatningsklass kan kombineras med variationer (variation) — undertyper angivna i bitar 5–7. Till exempel lägger TYPE_TEXT_VARIATION_PASSWORD (bit 5) till dold inmatning till TEXT-klassen. Variationsbitar: 0x000000E0 (mask TYPE_MASK_VARIATION).
InputType-flaggor och modifierare (bitar 8–31) lägger till extra funktioner till basklassen. De ändrar inte tangentbordstypen men modifierar inmatningsbeteendet. Flaggorna är specifika för varje klass — flaggor för TEXT fungerar inte med NUMBER och vice versa. Nedan listas de viktigaste modifierarna för varje klass.
Enligt Android Developers Documentation (2026) överlappar inte flaggor för olika klasser — ett försök att använda TEXT-flagga med NUMBER ignoreras. För att kontrollera en inställd flagga används bitvis AND: (inputType and FLAG) != 0.
Rätt kombination av InputType med klasser och flaggor är nyckeln till att skapa användarvänliga formulär. Låt oss titta på typiska scenarier och motsvarande InputType-konfigurationer. Varje scenario optimerar inmatning för en specifik datatyp, gör formuläret intuitivt och snabbar upp ifyllning.
| Scenario | InputType | Tangentbord |
|---|---|---|
| Namn | textCapWords | QWERTY, varje ord med versal |
| textEmailAddress | QWERTY med @ och . | |
| Lösenord | textPassword | QWERTY, dold inmatning |
| Telefon | phone | Siffror med +, #, * |
| Pris | numberDecimal | Siffror med komma |
| Kvantitet | number | Endast siffror |
| Kommentar | textCapSentences|textMultiLine | QWERTY, flerradig |
| Sök | text|textNoSuggestions | QWERTY utan förslag |
// Kombination för prisfält
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// Kombination för kommentarsfält
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
Att ställa in InputType programmatiskt via setInputType() skriver över det tidigare värdet. Om bara en del av masken behöver ändras (till exempel lägga till en flagga) måste det aktuella värdet sparas, ändras och tillämpas igen. Varje anrop av setInputType() omkonfigurerar EditTexts interna filter.
Metoden setRawInputType() skiljer sig från setInputType genom att den inte orsakar omkonfiguration av filter och förslag. Den används för tillfällig ändring av InputType utan fullständig omladdning av EditText-status. Efter anrop av setInputType() rekommenderas att starta om IME för att uppdatera tangentbordet.
// Växla mellan lösenord och synlig 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
}
// Behåll markörposition
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// Hämta inmatningsklass
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// Hämta inmatningsvariation
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// Kontrollera om lösenordsfält
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
Rätt val av InputType handlar inte bara om UX, utan även om säkerhet och datakorrekthet. Huvudrekommendationerna inkluderar: ange alltid explicit InputType för varje EditText; använd den mest specifika inmatningsklassen; kombinera inte flaggor från olika klasser; för fält med känslig data använd PASSWORD-variationer; för sökfält använd imeOptions=„actionSearch”.
InputType påverkar även funktionen hos tillgänglighetstjänster (Accessibility). Fält med typen textPassword får extra skydd från skärmläsare — de läser inte upp inmatade tecken högt. För fält med textEmailAddress informerar skärmläsaren användaren om att fältet är avsett för email och erbjuder lämpliga förslag.
Enligt Material Design Guidelines (2025) bör InputType motsvara den typ av data som användaren matar in. Felaktig InputType saktar inte bara ner inmatningen utan kan också leda till fel: till exempel om textMultiLine lämnas kvar för inmatning av telefonnummer, kommer tangentbordet inte att visa det numeriska blocket och användaren måste manuellt ändra layouten varje gång.
Vanliga frågor
InputType — är ett EditText-attribut som bestämmer typen av inmatade data via en bitmask. Keyboard Type — är det inofficiella namnet för den visuella tangentbordstyp som aktiveras av InputType. InputType påverkar även teckenfiltrering, automatisk korrigering och automatisk komplettering, inte bara tangentbordslayouten.
Ställ in editText.inputType = InputType.TYPE_CLASS_TEXT eller använd konstanten InputType.TYPE_NULL (0x00000000) för fullständig återställning. Med TYPE_NULL visas inget tangentbord när fältet fokuseras. För att återgå till standard textinmatning, ställ in TYPE_CLASS_TEXT utan flaggor.
Det går inte att skapa en ny InputType-klass eftersom den är en del av Android-ramverket. Du kan dock kombinera befintliga klasser och flaggor för att uppnå önskat beteende. Implementera ytterligare teckenfiltrering via InputFilter, som ställs in på EditText via metoden setFilters().
InputType skickas till inmatningssystemet via InputConnection. IME läser InputType-klassen och variationen och väljer motsvarande tangentbordslayout. Till exempel får TYPE_CLASS_NUMBER med TYPE_NUMBER_FLAG_DECIMAL tangentbordet att visa ett numeriskt block med komma. De flesta moderna tangentbord följer dessa rekommendationer.
Använd egenskapen editText.inputType i Kotlin eller metoden editText.getInputType() i Java. För att extrahera klassen, tillämpa masken: inputType and InputType.TYPE_MASK_CLASS. För att kontrollera en specifik flagga: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — om resultatet != 0 är flaggan inställd.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också