Як встановити колір повідомлення про помилку TextInputLayout?


90

Як я можу змінити колір повідомлення про помилку, яке можна встановити для відображення під текстовим полем у TextInputLayout(через setError(...)- див. Стан помилки тут )?

Зазвичай він відображається у вигляді червоного кольору, який я хочу змінити. Імена / ключі яких елементів слід використовувати у своєму styles.xmlфайлі для націлювання на колір?

Заздалегідь спасибі.


Редагувати:

Додано app:errorTextAppearanceключ до мого TextInputLayout:

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:id="@+id/welcome_current_week_container"
        app:errorTextAppearance="@style/WelcomeErrorAppearance">
        <EditText
            ..../>
    </android.support.design.widget.TextInputLayout>
</LinearLayout>

та поява помилки (для тестування встановлено зелений) :

<style name="WelcomeErrorAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@android:color/holo_green_dark</item>
</style>

Результат полягає в тому, що підказка, а також повідомлення про помилку кольорові (скріншоти з масштабованого емулятора Android) :

Звичайний (без помилок):

До зображення

Стан помилки:

Після зображення

Редагувати 2 / Результат:

Коли з'являється повідомлення про помилку, підказка над полем змінюється на той самий колір, що і повідомлення про помилку, замінюючи колір підказки - це за проектом.



Колір помилки замінює колір підказки у стані помилки. Це за задумом. Див. Google.com/design/spec/components/... Ви не можете обійти це, не змінивши клас TextInputLayout.
— Євген Печанець

@EugenPechanec Я не розумів, що це так. Дякую за пояснення
— Себ Ячек,

1
@EugenPechanec Я майже впевнений, що ви тут помиляєтесь. Частина, на яку ви посилаєтесь, - від лічильника символів. Для звичайних полів помилки повинні виглядати на цьому зображенні (зауважте, що підказка не забарвлена) material-design.storage.googleapis.com/publish/material_v_4/…
— Arkadiusz "летить" Rzadkowolski

2
@EugenPechanec code.google.com/p/android/issues/detail?id=195775 - це справді помилка, і це буде виправлено в майбутньому випуску :)
— Аркадіуш "летить" Рзадковольський

Відповіді:


140

Створіть власний стиль, який використовується @android:style/TextAppearanceяк батьківський у вашому styles.xmlфайлі:

<style name="error_appearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@color/red_500</item>
    <item name="android:textSize">12sp</item>
</style>

І використовуйте його у своєму віджеті TextInputLayout:

 <android.support.design.widget.TextInputLayout
            android:id="@+id/emailInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:errorTextAppearance="@style/error_appearance">

приклад помилки

Edit: Встановіть підказку на об'єкті, який знаходиться всередині вашого TextInputLayout ( EditText, TextViewі т.д.) для проведення різних кольорів для підказки і помилки.


1
Дякую. Здається прямолінійним, але ніяк не міг знайти його на все життя!
— Себ Ячек,

2
Оновлення: чи можна просто змінити стиль повідомлення про помилку? Здається, це також змінює стиль підказки над полем.
— Себ Ячек,

Справді? Не для мене, подивіться на малюнок вище. Ви впевнені, що присвоюєте стиль app:errorTextAppearance?
— dabo248,

1
@EugenPechanec Спрощене це виглядає наступним чином : <android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>. Так так, це ще один TextView, ось чому він не приймає колір помилки з TextInputLayout.
— dabo248

7
Якщо ви хочете змінити тільки колір, це краще , що ви встановили в цьому стилі parentз parent="TextAppearance.Design.Error". Таким чином, він зберігає розмір тексту за замовчуванням та будь-які інші атрибути, але давайте ви спеціально налаштуєте колір помилки, що було метою розглядуваного питання.
— w3bshark

28

Насправді, щоб змінити лише колір повідомлення про помилку, ви можете встановити textColorErrorу своїй темі (а також встановити colorControlNormalі colorControlActivatedдля загального кольору віджета та підказки). TextInputLayoutпіднімає цей атрибут. ПРИМІТКА: якщо встановити errorTextAppearanceвласний стиль textColorError, це не матиме ефекту.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">@color/control_normal</item>
    <item name="colorControlActivated">@color/control_activated</item>
    <item name="textColorError">@color/error</item>
    <!-- other styles... -->
</style>

А у вашому AndroidManifest.xml:

<application
    android:theme="@style/AppTheme"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">

    <!-- ... -->

</application>

17
Хтось справді повинен написати книгу про теми та стилі та всі можливі атрибути. Це по-справжньому божевільно, ви можете встановити колір і стиль, так багато способів, і немає ніякого способу дізнатися, який з них є правильним. І звичайно документації взагалі немає :( Я маю на увазі, що є, але це справді заплутано.
— aleksamarkoni

це набагато краща відповідь, ніж відповідь з вищим балом!
— philthomas26,

6
Для мене це рішення спричинило помилку ( textColorErrorне знайдено), але мені вдалося встановити colorErrorатрибут у моїй темі. Здається, кожна версія Android / Бібліотеки підтримки має свої атрибути теми.
— Слав

9
Я отримую " <item name="colorError">@color/error</item>
— Помилка

4
Будь ласка, оновіть публікацію .. textColorError тепер є colorError.
— Метт Вулф,

7

Примітка з одного боку. Я спробував прийняте рішення errorTextAppereance. Це працює дуже добре, але спочатку колір підкресленого введення не змінювався після застосування нового errorTextAppereanceстилю. Я бачу, що є кілька коментарів, і що інші люди стикаються з такою ж проблемою.

У моєму випадку це відбувалося, коли я встановлював новий стиль після встановлення нового тексту помилки. Подобається це:

passwordInputLayout.error = "Password strength"
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)

Після зміни порядку цих двох методів колір тексту та підкреслення змінюється належним чином.

passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
passwordInputLayout.error = "Password strength"

А стиль появи тексту помилки виглядає приблизно так:

<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
    <item name="android:textColor">@color/purple</item>
</style>

Як виглядає ваш R.style.InputError_Purple?
— toobsco42

Стиль @ toobsco42 визначає лише колір тексту. Я відредагував відповідь із фактичною реалізацією.
— Іван Маріч

Дякую! Я використовую це подання як для дійсного тексту, так і для тексту помилки (зеленого та червоного), і колір підкреслення, який неправильно змінювався, зводив мене з розуму.
— rexar5,

6

Мені потрібно було робити це динамічно. Використання рефлексії:

public static void setErrorTextColor(TextInputLayout textInputLayout, int color) {
  try {
    Field fErrorView = TextInputLayout.class.getDeclaredField("mErrorView");
    fErrorView.setAccessible(true);
    TextView mErrorView = (TextView) fErrorView.get(textInputLayout);
    Field fCurTextColor = TextView.class.getDeclaredField("mCurTextColor");
    fCurTextColor.setAccessible(true);
    fCurTextColor.set(mErrorView, color);
  } catch (Exception e) {
    e.printStackTrace();
  }
}

Вам потрібно буде зателефонувати, textInputLayout.setErrorEnabled(true)перш ніж використовувати вищезазначений метод, щоб це працювало.


Колір тексту помилки змінюється, але колір підкреслення все ще залишається. Він змінюється лише під час наступного виклику тієї ж функції
— Mohammad Shabaz Moosa

@ Dr.aNdRO Це використовує роздуми, це не гарантовано буде працювати завжди!
— ucMedia

3

З TextInputLayoutвключеним до бібліотеки компонентів матеріалу просто використовуйте app:errorTextColorатрибут.

    <com.google.android.material.textfield.TextInputLayout
        app:errorTextColor="@color/...."
        .../>

У власному стилі ви можете використовувати:

<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" >
   <item name="errorTextColor">@color/...</item>
   ...
</style>

введіть тут опис зображення


1

ОНОВЛЕННЯ

Будь ласка, використовуйте замість цього власний вигляд, а не цей


Модифікована версія відповіді @ jared, яка працює в моєму випадку:

public static void setErrorTextColor(TextInputLayout textInputLayout, int color) {
    try {
        Field fErrorView = TextInputLayout.class.getDeclaredField("mErrorView");
        fErrorView.setAccessible(true);
        TextView mErrorView = (TextView)fErrorView.get(textInputLayout);
        mErrorView.setTextColor(color);
        mErrorView.requestLayout();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Колір тексту помилки змінюється, але колір підкреслення все ще залишається. Він змінюється лише під час наступного виклику тієї ж функції
— Mohammad Shabaz Moosa

2
Не використовуйте це. це зараз не є надійним
— доктор aNdRO

0

Якщо ви використовуєте com.google.android.material.textfield.TextInputLayout цього макета введення, ніж ви просто встановили один стиль

<com.google.android.material.textfield.TextInputLayout
                        android:id="@+id/textInputLayoutPassword"
                        style="@style/LoginTextInputLayoutStyle"



<style name="LoginTextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
        <item name="boxStrokeColor">@color/text_input_box</item>
        <item name="errorTextColor">@color/colorRed</item>
    </style>

0

Залежно від потреби, можна змінювати / встановлювати колір тексту TextInputLayout динамічно або безпосередньо у XML-файлі макета. Нижче наведено зразки фрагментів коду

Створіть власний стиль, який використовує @android: style / TextAppearance як батьківський у вашому файлі styles.xml :

<style name="style_error_appearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@color/color_error</item>
    <item name="android:textSize">11sp</item>
</style>

І використовуйте його у своєму віджеті TextInputLayout:

  1. Безпосередньо у форматі XML
 <android.support.design.widget.TextInputLayout
            android:id="@+id/your_input_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:errorTextAppearance="@style/style_error_appearance">
  1. Динамічно у вашому класі
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);

Якщо ви хочете встановити одинарний / однаковий колір тексту помилки для вашої програми, визначте колір тексту в темі програми

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Error text color... -->
    <item name="textColorError">@color/color_error</item>
    <!-- other styles... -->
</style>

А у вашому AndroidManifest.xml:

<application
    android:theme="@style/AppTheme"
    android:icon="@drawable/ic_launcher"
    android:label="@string/your_app_name">

    <!-- ... -->

</application>

-2

Я заглянув у джерело TextInputLayout і зрозумів, що колір тексту помилки отримано з colors.xml. Просто додайте це до вашого colors.xml:

<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>

Працює для мене з доданою бібліотекою дизайну.
— Java Geek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.