Error State — стан помилки поля, відображення помилок і реалізація в Android

Автор: IT Sectr Опубліковано: 2026-07-09 Час читання: 5 хв

Error State — це стан поля введення, який візуально сигналізує про некоректні дані. В Android Error State реалізується через TextInputLayout.setError(), який підсвічує рамку червоним і показує текст помилки під полем. За даними Material Design Guidelines, 2026, Error State має бути помітним, але не агресивним: червона рамка, текст помилки, іконка. Правильне використання Error State підвищує конверсію форм на 20-30%, оскільки користувач швидко виявляє та виправляє помилки без втрати контексту.

Головне

  • Error State — візуальний стан поля, який показує користувачеві, що дані некоректні.
  • TextInputLayout.setError() — основний метод відображення помилки в Material Design Components.
  • Візуальні індикатори: червона рамка, текст помилки, іконка статусу, анімація появи.
  • Скидання помилки відбувається автоматично при зміні тексту або вручну через setError(null).
  • Кастомний Error State використовується, коли потрібне нестандартне відображення: тільки іконка, інший колір, група полів.

Що таке стан помилки поля в Android?

Error State — це спеціальний режим відображення поля введення, який активується, коли введені дані не пройшли валідацію. Візуально Error State включає три компоненти: зміна кольору контуру або фону поля (зазвичай на червоний), поява текстового повідомлення під полем з описом помилки та опціонально — іконка або підсвітка. Мета Error State — миттєво привернути увагу користувача до проблемного поля та підказати, як виправити помилку.

В Android Error State реалізований на рівні TextInputLayout з Material Design Components. TextInputLayout обгортає EditText і керує його станами: normal, focused, error, disabled. Метод setError(String) перемикає поле в стан помилки, змінює колір рамки та відображає повідомлення. При зміні тексту або виклику setError(null) поле повертається до normal.

За даними Material Design Guidelines, Error State має бути помітним, але не домінуючим. Червоний колір рамки має контрастувати зі звичайним станом, але не перевантажувати інтерфейс. Повідомлення про помилку має містити конкретну інформацію про проблему та спосіб її вирішення. Іконка помилки (наприклад, червоне коло зі знаком оклику) підсилює візуальний сигнал.

Як працює setError в TextInputLayout

Метод setError(CharSequence errorText) переводить TextInputLayout у стан помилки. Параметр errorText — текст, який відображається під полем. Якщо передати null, помилка скидається. TextInputLayout керує анімацією: текст помилки з'являється з плавним зникненням, рамка змінює колір на червоний. Іконка помилки (за замовчуванням знак оклику в колі) відображається в кінці поля.

Важливі деталі: setErrorEnabled(true) має бути викликано до setError, щоб виділити простір під повідомлення про помилку. Інакше при появі помилки макет може підстрибнути, оскільки місце під повідомлення не зарезервовано. Рекомендується завжди вмикати підтримку помилки в XML через app:errorEnabled="true", щоб уникнути зсуву макету.

Метод setError автоматично скидається при зміні тексту поля, якщо включена опція setErrorEnabled(true). Ця поведінка зручна для валідації в реальному часі: щойно користувач починає виправляти помилку, червона рамка зникає, і поле повертається до нормального стану. Однак для складних сценаріїв цей автоскид може бути небажаним — у таких випадках керуйте помилкою вручну.

kotlin
val til = findViewById<TextInputLayout>(R.id.til_email)

// Увімкнути підтримку помилки (встановити в XML інакше)
til.isErrorEnabled = true

// Встановити повідомлення про помилку
til.error = "Invalid email address"

// Очистити помилку
til.error = null

// Перевірити, чи існує помилка
if (til.error != null) {
    // Поле в стані помилки
}

У прикладі використовуються властивості Kotlin для доступу до setError/isErrorEnabled. TextInputLayout автоматично оновлює UI: змінює boxStrokeColor, показує error-іконку, відображає текст помилки. Якщо змінити текст в EditText, помилка скидається автоматично. Для ручного скидання призначте error = null.

Альтернативні способи відображення помилок

Не всі проекти використовують Material Design Components. Для кастомного відображення помилки можна використовувати окремий TextView під EditText, який стає видимим при помилці. Цей підхід дає повний контроль над стилями та розташуванням повідомлення. Наприклад, можна розмістити повідомлення праворуч від поля, використати інший колір фону або додати іконку ліворуч від тексту.

В Jetpack Compose Error State реалізується через параметр isError в OutlinedTextField або TextField. При isError = true рамка стає червоною, і можна показати текст помилки через supportingText. Compose не має вбудованого auto-clear при зміні тексту — розробник керує станом помилки вручну через remember та mutableStateOf.

Для групової помилки (одне повідомлення для кількох полів, наприклад, «Заповніть всі обов'язкові поля») використовується Snackbar, Dialog або inline-блок у верхній частині форми. Групова помилка не замінює Error State окремих полів, а доповнює його. Користувач спочатку бачить загальне повідомлення, потім шукає конкретні поля з помилками.

СпосібПлюсиМінусиКоли використовувати
TextInputLayout.setErrorСтандарт, анімація, auto-clearТільки з Material ComponentsОсновний варіант для MDC
Окремий TextViewПовний контроль стилівПотрібно керувати видимістю вручнуКастомні теми, без MDC
Compose isErrorВбудовано в ComposeРучне керування станомПроекти на Jetpack Compose
Snackbar/DialogГрупове повідомленняНе прив'язано до конкретного поляДоповнення до Error State поля

Кольори, іконки та анімація помилок

Колір Error State в Material Design Components керується через атрибут boxStrokeErrorColor або атрибут colorError в темі. За замовчуванням використовується системний червоний колір, але його можна перевизначити в темі додатка або безпосередньо в TextInputLayout через app:boxStrokeErrorColor="@color/customErrorColor". Для підтримки темної теми рекомендується використовувати селектор з різними кольорами для light та dark режимів.

Іконка помилки налаштовується через app:errorIconDrawable. За замовчуванням відображається знак оклику в колі. Можна замінити на кастомну іконку або прибрати зовсім, встановивши app:errorIconDrawable="@null". Іконка відображається в кінці TextInputLayout і служить додатковим візуальним маркером. В Material Design 3 іконка помилки обов'язкова для accessibility.

Анімація появи помилки вбудована в TextInputLayout: текст виїжджає знизу з плавною зміною прозорості. Для кастомної анімації використовуйте Transition API або MotionLayout. Наприклад, похитування поля при помилці привертає додаткову увагу. Але зловживання анімацією погіршує UX — достатньо плавної появи повідомлення.

Управління станом помилки при валідації

Управління Error State ділиться на два етапи: встановлення помилки при валідації поля та скидання помилки при виправленні. У найпростішому випадку валідація викликається в TextWatcher.afterTextChanged: якщо значення невалідне, викликається setError з повідомленням про помилку. Якщо валідне — setError(null). TextInputLayout автоматично ховає помилку, коли setError(null) скидає стан.

Для Form Validation помилки встановлюються на етапі відправки форми. Прохід по всіх полях, перевірка кожного, встановлення помилок для невалідних полів і фокус на першому помилковому полі. Кнопка відправки при цьому блокується. Якщо форма велика, рекомендується прокрутити екран до першого поля з помилкою та автоматично встановити на нього фокус.

Правило single error focus: при відправці форми встановлюйте фокус тільки на перше поле з помилкою. Користувач виправляє одну помилку за раз, і після виправлення наступне поле з помилкою автоматично отримує фокус. Такий покроковий підхід знижує когнітивне навантаження. Material TextInputLayout при встановленні помилки не перехоплює фокус — це потрібно робити вручну через requestFocus().

Помилки при роботі з Error State

Перша помилка — відсутність isErrorEnabled. Якщо setErrorEnabled не викликано до setError, макет може зсунутися при появі повідомлення про помилку. Особливо критично, якщо поле знаходиться в середині екрана — користувач втрачає позицію скролу. Завжди вмикайте setErrorEnabled(true) в XML через app:errorEnabled="true" або програмно перед встановленням помилки.

Друга помилка — надто довге повідомлення про помилку. Довгий текст переноситься на кілька рядків і може перекривати сусідні поля. Рекомендована довжина повідомлення про помилку — 20-40 символів. Якщо потрібна більша інформація, використовуйте helperText (підказка) в нормальному стані або тултип для додаткового пояснення. Стислість — основа хорошого Error State.

Третя помилка — ігнорування accessibility. Error State має бути доступним для screen readers. TextInputLayout автоматично анонсує помилку через contentDescription, але кастомні реалізації повинні робити це вручну. Використовуйте announceForAccessibility() або android:importantForAccessibility для повідомлень про помилку. Користувачі TalkBack повинні чути помилку одразу після її появи.

ПомилкаПроблемаРішення
Немає isErrorEnabledЗсув макету при помилціapp:errorEnabled="true" в XML
Довге повідомленняПерекриття сусідніх полів20-40 символів, helperText для деталей
Немає accessibilityScreen reader не чує помилкуВажливо для TalkBack користувачів
Автоскид без перевіркиПоле помилково вважається валіднимРучне керування скиданням помилки

Часто задавані питання

Як скинути Error State при виправленні помилки?

Якщо використовується TextInputLayout, викличте setError(null). Увімкніть setErrorEnabled(true), щоб простір під повідомлення залишалося зарезервованим, але текст зник. При зміні тексту в EditText TextInputLayout автоматично скидає помилку. Для ручного керування використовуйте addTextChangedListener і setError(null) при кожній зміні.

Чому при помилці зсувається макет?

Тому що місце під повідомлення про помилку не зарезервовано. Рішення: увімкніть app:errorEnabled="true" в XML для TextInputLayout. Це зарезервує місце під повідомлення, і макет не буде зсуватися. Якщо помилка неактивна, місце залишається порожнім, але макет стабільний.

Як змінити колір помилки в TextInputLayout?

Використовуйте атрибут app:boxStrokeErrorColor в XML або програмно через til.setBoxStrokeErrorStateList(). Колір можна задати селектором для різних станів. Також можна перевизначити системний атрибут colorError в темі додатка, щоб змінити колір помилки глобально для всіх полів.

Чи можна показати помилку без зміни кольору рамки?

Так, використовуйте app:errorEnabled="true" і setError() — але перевизначте boxStrokeErrorColor на основний колір поля. Іконка і текст помилки все одно будуть видні, але рамка залишиться вихідного кольору. Однак це знижує помітність помилки, що суперечить рекомендаціям Material Design щодо accessibility.

Як реалізувати Error State в Jetpack Compose?

В Compose використовуйте isError = true в OutlinedTextField або TextField. Текст помилки передається через параметр supportingText. Керуйте станом через mutableStateOf. При зміні тексту скидайте isError вручну. Compose не має auto-clear помилки, на відміну від TextInputLayout в View-системі.

Підсумки

  • Error State — візуальний стан поля, що сигналізує про помилку через червону рамку, текст та іконку.
  • TextInputLayout.setError() — основний метод управління Error State в Material Design Components.
  • isErrorEnabled має бути включений для запобігання зсуву макету при появі помилки.
  • Альтернативні способи: окремий TextView для помилки, Snackbar для групових помилок, Compose isError.
  • Колір та іконка помилки налаштовуються через boxStrokeErrorColor та errorIconDrawable.
  • Accessibility обов'язкова: screen reader має оголошувати помилку при її появі.
  • Управління помилкою при валідації: встановлення при невалідному значенні, скидання при виправленні або вручну.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також