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 Text Fields с минимално усилие от страна на разработчика.
За разлика от стандартния 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, намалявайки размера на шрифта и променяйки цвета. Това поведение решава проблема с невидимостта на подсказа след започване на въвеждане.
Настройката на floating label се осъществява чрез атрибутите на TextInputLayout: app:hintEnabled определя дали плаващият етикет е включен (по подразбиране true), app:hintAnimationEnabled включва или изключва анимацията на преход, app:expandedHintEnabled разрешава показване на етикета дори когато полето е празно и без фокус. Цветът на етикета в различни състояния се управлява чрез стиловете colorPrimary и colorControlHighlight.
Според Google Material Components Team (2025), floating label е особено полезен във форми с голям брой полета, където потребителят може да забрави името на полето след започване на въвеждане. За разлика от простия android:hint, който изчезва при въвеждане, floating label остава винаги видим, осигурявайки контекст за всяко поле.
| Атрибут | Описание | По подразбиране |
|---|---|---|
| hintEnabled | Включва или изключва плаващия етикет | true |
| hintAnimationEnabled | Включва анимацията на повдигане/спускане на етикета | true |
| expandedHintEnabled | Показва етикета дори когато полето е празно и без фокус | false |
| hintTextAppearance | Стил на текста на плаващия етикет | Тема на приложението |
TextInputLayout предоставя вградена система за показване на грешки, която е визуално интегрирана с полето за въвеждане. При задаване на грешка чрез метода error, компонентът осветява полето (цветът на линията или контура се променя на червен) и показва текста на грешката под полето. Това заменя необходимостта от отделен TextView за съобщения за грешки.
Управлението на показването на грешки се осъществява чрез методите setError(CharSequence) и setErrorEnabled(boolean). При извикване на setError с текст, грешката се показва веднага; при извикване на setError(null) — се скрива. TextInputLayout също поддържа персонализирана икона за грешка чрез атрибута app:errorIconDrawable и управление на цвета на грешката чрез app:errorTextColor.
Според Material Design Guidelines (2025), съобщенията за грешки трябва да са конкретни и полезни: вместо „Невалидно въвеждане" пишете „Имейлът трябва да съдържа @". Показването на грешка трябва да става след завършване на въвеждането (след загуба на фокус или след изпращане на формата), а не в реално време — това намалява стреса на потребителя при попълване на формата.
// Програмно задаване на грешка
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, включващ валидация на имейл и парола, показване на грешки и икона за показване на парола. При натискане на бутона за регистрация всички полета се проверяват и се показват съответните съобщения за грешки.
@+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, запазвайки функционалността за грешки, икони и брояч на символи, но без анимация на етикета. Полезно за полета, където подсказ не е необходим или се използва персонализиран етикет.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също