Як встановити колір повідомлення про помилку 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.