EditText — to podstawowy komponent Android przeznaczony do wprowadzania i edycji tekstu w interfejsie użytkownika. Dziedziczy po TextView i umożliwia wprowadzanie znaków z wirtualnej lub fizycznej klawiatury. EditText obsługuje wiele trybów: tekst jedno- i wieloliniowy, hasła, liczby, adresy e-mail i numery telefonów. Według Android Developers (2026), EditText jest używany w ponad 90% aplikacji Android do tworzenia formularzy, pól wyszukiwania, czatów i ekranów wprowadzania danych.
Najważniejsze
EditText — to klasa z pakietu android.widget, która implementuje interaktywne pole tekstowe do wprowadzania danych przez użytkownika. W hierarchii dziedziczenia Android EditText extends TextView, więc dziedziczy wszystkie właściwości etykiety tekstowej, w tym zarządzanie czcionkami, kolorami i wyrównaniem. Główna różnica między EditText a TextView polega na możliwości edycji treści — użytkownik może wprowadzać, usuwać i zmieniać tekst bezpośrednio w interfejsie.
Każdy EditText jest powiązany z instancją Editable, która przechowuje wprowadzony tekst i obsługuje operacje wstawiania, usuwania i zamiany znaków. Podczas wprowadzania tekstu EditText automatycznie zarządza pozycją kursora, zaznaczaniem tekstu i historią zmian do cofania (undo/redo). Według Android Developers Guide (2026), EditText obsługuje również autouzupełnianie przez klasę AutoCompleteTextView, która dziedziczy z EditText.
Architektura EditText opiera się na separacji modelu (Editable), widoku (TextView) i kontrolera (InputConnection). Po otrzymaniu fokusu EditText tworzy InputConnection, przez który system wprowadzania przekazuje znaki, naciśnięcia klawiszy i polecenia edycji. Ten mechanizm zapewnia kompatybilność z dowolnymi metodami wprowadzania — od wirtualnych klawiatur po fizyczne klawiatury Bluetooth i wprowadzanie głosowe.
val editText = EditText(context).apply {
hint = "Wprowadź tekst"
inputType = InputType.TYPE_CLASS_TEXT
maxLines = 1
setTextColor(Color.parseColor("#000000"))
}
EditText udostępnia dziesiątki atrybutów do precyzyjnego dostosowania zachowania i wyglądu. Można je ustawić zarówno w układzie XML, jak i programowo przez Kotlin lub Java. Atrybuty dzielą się na kategorie: zarządzanie tekstem, ograniczenia, wygląd wizualny i interakcja z klawiaturą.
| Atrybut | Opis | Przykładowa wartość |
|---|---|---|
| android:hint | Tekst podpowiedzi wyświetlany w pustym polu | „Wprowadź e-mail" |
| android:inputType | Tryb wprowadzania (tekst, liczba, hasło itd.) | textEmailAddress |
| android:maxLines | Maksymalna liczba wierszy | 3 |
| android:maxLength | Maksymalna długość tekstu w znakach | 100 |
| android:textColorHint | Kolor tekstu podpowiedzi | #999999 |
Atrybut android:hint jest jednym z najważniejszych — informuje użytkownika, jakie dane są oczekiwane w polu. Podczas wprowadzania tekstu hint automatycznie znika. Hint nie uczestniczy w wysyłaniu formularza i nie jest zapisywany jako wartość pola. Material Design zaleca używanie TextInputLayout z pływającą etykietą zamiast zwykłego hint dla bardziej nowoczesnego wyglądu.
<!-- EditText in XML layout -->
@+id/etEmail
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter email"
android:inputType="textEmailAddress"
android:maxLines="1"
android:importantForAutofill="yes" />
Atrybut inputType określa, jaki typ klawiatury zostanie pokazany użytkownikowi i jakie znaki są dozwolone do wprowadzania. Jest to maska bitowa, gdzie klasa wprowadzania (TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE) jest łączona z modyfikatorami.
Każdy tryb wprowadzania nie tylko zmienia układ klawiatury, ale także wpływa na przetwarzanie tekstu: w trybie numerycznym dozwolone są tylko cyfry i separator dziesiętny, w trybie e-mail dostępny jest symbol @ i domeny, a w trybie telefonicznym wyświetlane są cyfry i symbole +, #, *. Wybór odpowiedniego inputType ma krytyczny wpływ na doświadczenie użytkownika — nieodpowiednia klawiatura zmusza użytkownika do przełączania trybów, co zwiększa czas wypełniania formularza o 30–50%.
Według Material Design Guidelines (2025), zaleca się używanie jak najbardziej konkretnego inputType dla każdego pola: textPassword dla haseł, numberDecimal dla cen, phone dla numerów telefonów, textMultiLine dla wprowadzania wieloliniowego. Przyspiesza to wypełnianie formularzy i zmniejsza liczbę błędów wprowadzania.
// Programowe ustawienie inputType
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
TextWatcher — to interfejs do śledzenia zmian tekstu w EditText w czasie rzeczywistym. Zawiera trzy metody: beforeTextChanged wywoływana przed zmianą, onTextChanged — w trakcie zmiany, afterTextChanged — po zakończeniu zmiany tekstu. TextWatcher jest używany do walidacji wprowadzania, liczenia znaków, wyszukiwania i autouzupełniania.
OnEditorActionListener obsługuje działania użytkownika na klawiaturze: naciśnięcie przycisku Done (IME_ACTION_DONE), wyszukiwania (IME_ACTION_SEARCH), wysyłania (IME_ACTION_SEND), przejścia do następnego pola (IME_ACTION_NEXT) i innych. Ten nasłuchiwacz jest szczególnie przydatny do organizacji nawigacji po formularzu — po naciśnięciu Next fokus automatycznie przechodzi do następnego pola, a po naciśnięciu Done klawiatura jest ukrywana i wykonywane jest wysyłanie.
Według Android Developers Blog (2025), prawidłowe użycie OnEditorActionListener z atrybutem android:imeOptions pozwala tworzyć intuicyjne formularze bez dodatkowych przycisków wysyłania — użytkownik wypełnia pola i naciska Done na klawiaturze, co uruchamia zapisywanie lub wyszukiwanie.
// TextWatcher do walidacji e-maila
editText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
val isValid = Patterns.EMAIL_ADDRESS.matcher(s).matches()
editText.error = if (isValid) null else "Invalid email format"
}
})
// OnEditorActionListener do wysyłania formularza
editText.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
submitForm()
true
} else false
}
Rozważmy pełny przykład tworzenia ekranu logowania z użyciem EditText do wprowadzania e-mail i hasła. W tym przykładzie pokazano konfigurację inputType, walidację przez TextWatcher i obsługę naciśnięcia przycisku logowania.
@+id/etLoginEmail
android:layout_width="match_parent"
android:hint="Email"
android:inputType="textEmailAddress"
android:maxLines="1" />
@+id/etLoginPassword
android:layout_width="match_parent"
android:hint="Password"
android:inputType="textPassword"
android:maxLines="1" />
class LoginFragment : Fragment() {
private lateinit var etEmail: EditText
private lateinit var etPassword: EditText
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
etEmail = view.findViewById(R.id.etLoginEmail)
etPassword = view.findViewById(R.id.etLoginPassword)
etEmail.addTextChangedListener(emailWatcher)
etPassword.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
performLogin()
true
} else false
}
}
}
EditText obsługuje dostosowywanie przez atrybuty XML, motywy i style. Można zmieniać kolor tekstu, kolor podpowiedzi, kolor podkreślenia (backgroundTint), styl czcionki, rozmiar tekstu i wiele innych. Material Components udostępnia motyw MaterialComponents. EditText z niestandardowymi atrybutami, w tym boxStrokeColor, boxBackgroundColor i endIconMode.
Do zmiany koloru podkreślenia EditText używa się atrybutu android:backgroundTint, który ustawia kolor dla stanu domyślnego i stanu fokusu. W Material Design kolor podkreślenia jest zarządzany przez colorPrimary motywu. Do pełnego dostosowania można utworzyć własny drawable jako tła w folderze res/drawable.
| Styl | Atrybut | Rezultat |
|---|---|---|
| Kolor tekstu | android:textColor | Zmienia kolor wprowadzonego tekstu |
| Kolor hint | android:textColorHint | Zmienia kolor tekstu podpowiedzi |
| Podkreślenie | android:backgroundTint | Zmienia kolor linii pod polem |
| Rozmiar czcionki | android:textSize | Ustawia rozmiar tekstu w sp |
| Czcionka | android:fontFamily | Podłącza niestandardową czcionkę |
Do stworzenia jednolitego stylu wszystkich EditText w aplikacji zaleca się zdefiniowanie globalnego stylu w motywie. Material Design oferuje styl Widget.MaterialComponents.TextInputLayout.OutlinedBox, który automatycznie stosuje się do wszystkich pól wprowadzania używających TextInputLayout. Zapewnia to spójny wygląd bez powielania atrybutów w każdym układzie.
Często zadawane pytania
EditText dziedziczy z TextView i dodaje możliwość edycji tekstu. TextView tylko wyświetla tekst, a EditText pozwala użytkownikowi wprowadzać, usuwać i zmieniać treść. EditText obsługuje również inputType, TextWatcher, zarządzanie kursorem i inne funkcje związane z wprowadzaniem danych.
Użyj InputFilter — interfejsu do filtrowania wprowadzanych znaków. EditText obsługuje ustawienie tablicy filtrów przez metodę setFilters(). Na przykład InputFilter.LengthFilter ogranicza długość tekstu, a niestandardowy InputFilter może zabraniać określonych znaków, wyrażeń regularnych lub zakresów Unicode.
Wywołaj metodę editText.text.toString() w Kotlin lub editText.getText().toString() w Java. Właściwość text zwraca Editable, który jest konwertowany na String przez toString(). Ważne jest sprawdzanie tekstu pod kątem null i pustości przed użyciem, szczególnie w formularzach z obowiązkowymi polami.
Ustaw atrybut android:inputType="textMultiLine" lub programowo dodaj flagę InputType.TYPE_TEXT_FLAG_MULTI_LINE. W trybie wieloliniowym EditText umożliwia łamanie wiersza przez Enter i automatycznie zwiększa wysokość. Do ograniczenia wysokości użyj android:maxLines lub android:minLines.
Ustaw atrybut android:enabled="false" lub wywołaj editText.isEnabled = false w kodzie. Wyłączony EditText nie reaguje na dotknięcia, nie otrzymuje fokusu i wyświetla się w szarym kolorze (disabled state). Alternatywą jest użycie android:focusable="false", co wyłącza wprowadzanie, ale zachowuje normalny wygląd.
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ż