TextInputLayout: какво е, Material Design и настройка в Android

Автор: IT Sectr Публикувано: 2026-07-07 Време за четене: 9 мин

TextInputLayout — е компонент от библиотеката Material Components за Android, който обгръща EditText и добавя разширени възможности за въвеждане на текст. Основната функция на TextInputLayout е плаващият етикет (floating label), който се издига над полето при въвеждане на текст, спестявайки място и подобрявайки четливостта. Допълнително компонентът поддържа показване на съобщения за грешки, икони вътре в полето, брояч на символи и различни стилове на оформление. Според Material Design Guidelines (2025), TextInputLayout е препоръчителният начин за създаване на текстови полета в Android приложения, съответстващи на стандартите Material Design 3.

Основни точки

  • TextInputLayout — обвивка за EditText от Material Components с floating label.
  • Floating label — етикетът се издига над полето при въвеждане на текст, спестявайки място на екрана.
  • Грешки — вградено показване на съобщения за грешки под полето за въвеждане.
  • Икони — поддръжка на леви и десни икони за действия (покажи парола, изчисти).
  • Стилове — два основни стила: FilledBox и OutlinedBox, както и персонализирани теми.

Какво е TextInputLayout в Android

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.

xml
<!-- 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 и неговата настройка

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

TextInputLayout предоставя вградена система за показване на грешки, която е визуално интегрирана с полето за въвеждане. При задаване на грешка чрез метода error, компонентът осветява полето (цветът на линията или контура се променя на червен) и показва текста на грешката под полето. Това заменя необходимостта от отделен TextView за съобщения за грешки.

Управлението на показването на грешки се осъществява чрез методите setError(CharSequence) и setErrorEnabled(boolean). При извикване на setError с текст, грешката се показва веднага; при извикване на setError(null) — се скрива. TextInputLayout също поддържа персонализирана икона за грешка чрез атрибута app:errorIconDrawable и управление на цвета на грешката чрез app:errorTextColor.

Според Material Design Guidelines (2025), съобщенията за грешки трябва да са конкретни и полезни: вместо „Невалидно въвеждане" пишете „Имейлът трябва да съдържа @". Показването на грешка трябва да става след завършване на въвеждането (след загуба на фокус или след изпращане на формата), а не в реално време — това намалява стреса на потребителя при попълване на формата.

kotlin
// Програмно задаване на грешка
textInputLayout.error = "Password min 8 chars"

// Скриване на грешка
textInputLayout.error = null

// Проверка и задаване на грешка при валидация
if (email.isNullOrBlank()) {
    tilEmail.error = "Email is required"
} else {
    tilEmail.error = null
}

Икони и действия на TextInputLayout

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, а също така анимира иконата на око.

  • password_toggle — икона на око за показване/скриване на парола, вградена анимация.
  • clear_text — кръстче за изчистване на полето, появява се при наличие на текст.
  • dropdown_menu — стрелка за Exposed Dropdown Menu (Material Design 3).
  • custom — всяка персонализирана икона с обработка чрез setEndIconOnClickListener.
xml
<!-- 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>

Стилове на TextInputLayout: FilledBox и OutlinedBox

Material Components за Android предоставя два основни стила за TextInputLayout: FilledBox (запълнен) и OutlinedBox (с контур). Стилът FilledBox има цветен фон и линия под полето, която променя цвета си при фокус. Стилът OutlinedBox има прозрачен фон и контур около цялото поле, което създава по-ясни граници и е по-подходящ за форми с голям брой полета.

Изборът на стил зависи от дизайна на приложението: FilledBox се препоръчва за често използвани форми, тъй като привлича по-малко внимание към отделните полета. OutlinedBox се предпочита за кратки форми (влизане, регистрация), където всяко поле трябва да бъде ясно обозначено. Стилът се задава чрез атрибута style в XML или чрез темата на приложението.

ХарактеристикаFilledBoxOutlinedBox
ФонЗапълване с цвят (обикновено сив)Прозрачен
ГраницаЛиния отдолуКонтур около полето
ФокусЛинията се удебелява и променя цветаКонтурът променя цвета и се удебелява
ПрепоръкаФорми с често въвежданеКратки форми, акцент върху полетата
СтилWidget.MaterialComponents.TextInputLayout.FilledBoxWidget.MaterialComponents.TextInputLayout.OutlinedBox

Material Design 3 (M3) представи актуализирани стилове за TextInputLayout с подобрена типография, нови цветови токени и поддръжка за динамични цветове Material You. В M3 OutlinedBox стана препоръчителният стил по подразбиране, а FilledBox адаптира разстоянията и радиуса на заобляне, за да съответства на новата спецификация.

Примери за код с TextInputLayout

Пълен пример за имплементация на форма за регистрация с TextInputLayout, включващ валидация на имейл и парола, показване на грешки и икона за показване на парола. При натискане на бутона за регистрация всички полета се проверяват и се показват съответните съобщения за грешки.

XML маркировка на формата за регистрация

xml
@+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>

Валидация на формата в Kotlin

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

Често задавани въпроси

Каква версия на Material Components е необходима за TextInputLayout?

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.

Как да добавя брояч на символи в TextInputLayout?

Задайте атрибута app:counterEnabled="true" и определете максималния брой символи чрез app:counterMaxLength="100". TextInputLayout автоматично ще покаже брояча в долната част на полето (напр. „25/100"). Цветът на брояча може да се конфигурира чрез app:counterTextColor и app:counterOverflowTextColor за превишаване на лимита.

Каква е разликата между стиловете FilledBox и OutlinedBox?

FilledBox — цветен фон, акцент върху долната линия. Заема по-малко визуално пространство. OutlinedBox — прозрачен фон с контур около полето, по-видими граници. FilledBox се препоръчва за често използвани полета, OutlinedBox за кратки форми, където яснотата на всяко поле е важна.

Може ли TextInputLayout да се използва без Floating Label?

Да, задайте атрибута app:hintEnabled="false", за да изключите плаващия етикет. В този случай TextInputLayout ще работи като обикновена обвивка за EditText, запазвайки функционалността за грешки, икони и брояч на символи, но без анимация на етикета. Полезно за полета, където подсказ не е необходим или се използва персонализиран етикет.

Резюме

  • TextInputLayout — обвивка за EditText от Material Components с floating label, грешки и икони.
  • Floating label решава проблема със скриването на подсказа при въвеждане — етикетът се издига и остава видим.
  • Грешките се показват под полето с червено осветяване на границите, без отделен TextView.
  • Иконите endIconMode поддържа password_toggle, clear_text, dropdown_menu и custom.
  • Стиловете FilledBox и OutlinedBox — два основни варианта на външния вид на полето за въвеждане.
  • Броячът на символи се активира чрез counterEnabled и counterMaxLength.
  • Material Design 3 добавя динамични цветове Material You и актуализирани стилове OutlinedBox.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също