TextInputLayout — це компонент із бібліотеки Material Components для Android, який обертає EditText і додає розширені можливості для введення тексту. Основна функція TextInputLayout — плаваюча мітка (floating label), яка піднімається над полем під час введення тексту, економлячи місце та покращуючи читабельність. Додатково компонент підтримує відображення повідомлень про помилки, іконки всередині поля, лічильник символів та різні стилі оформлення. Згідно з Material Design Guidelines (2025), TextInputLayout є рекомендованим способом створення текстових полів в Android-додатках, що відповідають стандартам Material Design 3.
Головне
TextInputLayout — це ViewGroup із пакета com.google.android.material.textfield, яка розширює LinearLayout і містить у собі EditText. Компонент входить до складу бібліотеки Material Components для Android, починаючи з версії 1.0.0. Основне завдання TextInputLayout — надати готову реалізацію Material Design текстових полів з мінімальними зусиллями з боку розробника.
На відміну від стандартного EditText, TextInputLayout керує анімацією плаваючої мітки, яка задається через атрибут android:hint внутрішнього EditText. Коли поле порожнє, мітка відображається всередині поля як звичайна підказка. Щойно користувач починає введення, мітка анімовано переміщується у верхню частину поля, зменшуючись у розмірі. Згідно з Material Design Guidelines (2025), така анімація покращує сприйняття форми, оскільки користувач завжди бачить назву поля, навіть після введення даних.
Архітектурно TextInputLayout реалізує патерн декоратора: він перехоплює події EditText, керує відображенням додаткових елементів (мітка, помилка, іконки, лічильник) і координує їх анімацію. Внутрішній EditText доступний через метод getEditText() і може бути сконфігурований стандартними атрибутами, включаючи inputType, maxLines та hint.
<!-- Basic TextInputLayout markup -->
@+id/tilEmail
android:layout_width="match_parent"
android:layout_height="wrap_content">
@+id/etEmail
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
Плаваюча мітка (floating label) — це ключова можливість TextInputLayout. Коли поле порожнє, текст із android:hint відображається всередині EditText як звичайна підказка. При отриманні фокусу або під час введення тексту мітка піднімається у верхню частину TextInputLayout, зменшуючи розмір шрифту та змінюючи колір. Така поведінка вирішує проблему невидимості підказки після початку введення.
Налаштування плаваючої мітки здійснюється через атрибути TextInputLayout: app:hintEnabled визначає, чи ввімкнена плаваюча мітка (за замовчуванням true), app:hintAnimationEnabled — вмикає або вимикає анімацію переходу, app:expandedHintEnabled — дозволяє відображення мітки, навіть якщо поле порожнє і не у фокусі. Колір мітки в різних станах керується через стилі colorPrimary та colorControlHighlight.
За даними Google Material Components Team (2025), плаваюча мітка особливо корисна у формах з великою кількістю полів, де користувач може забути назву поля після початку введення. На відміну від простого android:hint, який зникає під час введення, плаваюча мітка залишається видимою завжди, забезпечуючи контекст для кожного поля.
| Атрибут | Опис | За замовчуванням |
|---|---|---|
| hintEnabled | Вмикає або вимикає плаваючу мітку | true |
| hintAnimationEnabled | Вмикає анімацію підйому/опускання мітки | true |
| expandedHintEnabled | Показує мітку, навіть якщо поле порожнє і без фокусу | false |
| hintTextAppearance | Стиль тексту плаваючої мітки | Тема додатку |
TextInputLayout надає вбудовану систему відображення помилок, яка візуально інтегрована з полем введення. При встановленні помилки через метод setError, компонент підсвічує поле (колір лінії або обводки змінюється на червоний) і відображає текст помилки під полем. Це замінює необхідність в окремому TextView для повідомлень про помилки.
Управління відображенням помилок здійснюється через методи setError(CharSequence) та setErrorEnabled(boolean). При виклику setError з текстом помилка відображається одразу; при виклику setError(null) — приховується. TextInputLayout також підтримує кастомну іконку помилки через атрибут app:errorIconDrawable та управління кольором помилки через app:errorTextColor.
Згідно з Material Design Guidelines (2025), повідомлення про помилки мають бути конкретними та корисними: замість «Невірне введення» писати «Email повинен містити @». Відображення помилки має відбуватися після завершення введення (при втраті фокусу або після відправлення форми), а не в реальному часі — це знижує стрес користувача під час заповнення форми.
// Програмне налаштування помилок
textInputLayout.error = "Password min 8 chars"
// Приховування помилок
textInputLayout.error = null
// Перевірка та встановлення помилок валідації
if (email.isNullOrBlank()) {
tilEmail.error = "Email is required"
} else {
tilEmail.error = null
}
TextInputLayout підтримує відображення іконок як на початку поля (start icon), так і в кінці (end icon). Іконки можуть виконувати різні функції: зміна видимості пароля, очищення поля, кастомна дія. Кожен тип іконки керується окремим атрибутом і може бути замінений на кастомну через атрибут app:startIconDrawable або app:endIconDrawable.
End icon mode задається через атрибут app:endIconMode, який може приймати значення: password_toggle — перемикання видимості пароля, clear_text — очищення поля, dropdown_menu — стрілка для випадного списку, custom — кастомна іконка. Для password_toggle TextInputLayout автоматично керує перемиканням inputType між textPassword та textVisiblePassword, а також анімує іконку ока.
<!-- TextInputLayout with password toggle icon -->
@+id/tilPassword
android:layout_width="match_parent"
app:endIconMode="password_toggle"
app:passwordToggleTint="@color/primary">
@+id/etPassword
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
Material Components для Android надає два основні стилі для TextInputLayout: FilledBox (заповнений) та OutlinedBox (з обводкою). Стиль FilledBox має залитий кольором фон та лінію під полем, яка змінює колір при фокусі. Стиль OutlinedBox має прозорий фон та обводку навколо всього поля, що створює більш чіткі межі та краще підходить для форм з великою кількістю полів.
Вибір стилю залежить від дизайну додатку: FilledBox рекомендується для форм з частішим використанням, оскільки привертає менше уваги до окремих полів. OutlinedBox переважний для коротких форм (логін, реєстрація), де кожне поле має бути чітко позначене. Стиль задається через атрибут style в XML або через тему додатку.
| Характеристика | FilledBox | OutlinedBox |
|---|---|---|
| Фон | Заливка кольором (зазвичай сірий) | Прозорий |
| Межа | Лінія знизу | Обводка навколо поля |
| Фокус | Лінія потовщується і змінює колір | Обводка змінює колір і потовщується |
| Рекомендація | Форми з частим введенням | Короткі форми, акцент на полях |
| Стиль | Widget.MaterialComponents.TextInputLayout.FilledBox | Widget.MaterialComponents.TextInputLayout.OutlinedBox |
Material Design 3 (M3) представив оновлені стилі для TextInputLayout з покращеною типографікою, новими колірними токенами та підтримкою динамічних кольорів Material You. У M3 OutlinedBox став рекомендованим стилем за замовчуванням, а FilledBox адаптував відступи та радіус скруглення для відповідності новій специфікації.
Повний приклад реалізації форми реєстрації з TextInputLayout, що включає валідацію email та пароля, відображення помилок та іконку показу пароля. При натисканні кнопки реєстрації перевіряються всі поля та відображаються відповідні повідомлення про помилки.
@+id/tilName
app:boxBackgroundMode="outlined">
@+id/etName
android:hint="Name" />
</...TextInputLayout>
@+id/tilRegEmail
app:boxBackgroundMode="outlined">
@+id/etRegEmail
android:hint="Email"
android:inputType="textEmailAddress" />
</...TextInputLayout>
@+id/tilRegPassword
app:boxBackgroundMode="outlined"
app:endIconMode="password_toggle">
@+id/etRegPassword
android:hint="Password"
android:inputType="textPassword" />
</...TextInputLayout>
private fun validateForm(): Boolean {
var isValid = true
if (etName.text.isNullOrBlank()) {
tilName.error = "Enter your name"
isValid = false
} else {
tilName.error = null
}
val email = etRegEmail.text.toString()
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
tilRegEmail.error = "Invalid email format"
isValid = false
} else {
tilRegEmail.error = null
}
val password = etRegPassword.text.toString()
if (password.length < 8) {
tilRegPassword.error = "Password min 8 chars"
isValid = false
} else {
tilRegPassword.error = null
}
return isValid
}
Часті запитання
TextInputLayout доступний починаючи з версії 1.0.0 бібліотеки com.google.android.material. Для можливостей Material Design 3 використовуй версію 1.6.0 і вище. Підключення: implementation «com.google.android.material:material:1.12.0» у build.gradle модуля.
Колір плаваючої мітки у стані фокусу керується атрибутом app:hintTextColor або через тему за допомогою colorPrimary. Для різних станів (фокус, помилка, disabled) використовуй селектор у res/color/ або атрибути boxStrokeColor, errorTextColor із бібліотеки Material Components.
Встанови атрибут app:counterEnabled=“true” та задай максимальну кількість символів через app:counterMaxLength=“100”. TextInputLayout автоматично відобразить лічильник внизу поля (наприклад, «25/100»). Колір лічильника можна налаштувати через app:counterTextColor та app:counterOverflowTextColor для перевищення ліміту.
FilledBox — фон залитий кольором, акцент на лінії знизу. Займає менше візуального простору. OutlinedBox — прозорий фон з обводкою навколо поля, більш помітні межі. FilledBox рекомендується для частих полів, OutlinedBox — для коротких форм, де важлива чіткість кожного поля.
Так, встанови атрибут app:hintEnabled=“false”, щоб вимкнути плаваючу мітку. У цьому випадку TextInputLayout працюватиме як звичайна обгортка для EditText, зберігаючи функціональність помилок, іконок та лічильника символів, але без анімації мітки. Корисно для полів, де hint не потрібен або використовується кастомна мітка.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також