Jak mogę zmienić kolor komunikatu o błędzie, który można ustawić tak, aby pojawiał się pod polem tekstowym w TextInputLayout
(przez setError(...)
- zobacz stan błędu tutaj )?
Zwykle pokazuje się jako czerwony kolor, który chcę zmienić. Których nazw / kluczy elementów powinienem użyć w moim styles.xml
pliku, aby ustawić kolor?
Z góry dziękuję.
Edytować:
Dodano app:errorTextAppearance
klucz do mojego 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>
i wygląd błędu (ustawiony na zielony do testowania) :
<style name="WelcomeErrorAppearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@android:color/holo_green_dark</item>
</style>
W rezultacie podpowiedź i komunikat o błędzie są kolorowe (zrzuty ekranu ze skalowanego emulatora Androida) :
Zwykły (bez błędu):
Stan błędu:
Edycja 2 / wynik:
Gdy pojawia się komunikat o błędzie, podpowiedź nad polem zmienia się na ten sam kolor co komunikat o błędzie, zastępując kolor podpowiedzi - jest to zgodne z projektem.
źródło
Odpowiedzi:
Utwórz własny styl, który będzie używany
@android:style/TextAppearance
jako element nadrzędny w Twoimstyles.xml
pliku:<style name="error_appearance" parent="@android:style/TextAppearance"> <item name="android:textColor">@color/red_500</item> <item name="android:textSize">12sp</item> </style>
I użyj go w swoim widżecie 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: Ustaw wskazówkę na obiekcie, który jest wewnątrz TextInputLayout (
EditText
,TextView
etc.) do przechowywania różnych kolorów za podpowiedź i błędów.źródło
app:errorTextAppearance
?<android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>
. Więc tak, to kolejny TextView, dlatego nie przyjmuje koloru błędu z TextInputLayout.parent
naparent="TextAppearance.Design.Error"
. W ten sposób zachowuje domyślny rozmiar tekstu i wszelkie inne atrybuty, ale pozwala dostosować konkretnie kolor błędu, który był celem pytania.Właściwie, aby zmienić tylko kolor komunikatu o błędzie, możesz ustawić
textColorError
motyw (a także ustawićcolorControlNormal
icolorControlActivated
dla ogólnego widżetu i koloru tekstu podpowiedzi).TextInputLayout
przejmuje ten atrybut. UWAGA: jeśli ustawiszerrorTextAppearance
styl niestandardowy, nietextColorError
przyniesie to żadnego efektu.<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>
A w pliku AndroidManifest.xml:
<application android:theme="@style/AppTheme" android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <!-- ... --> </application>
źródło
textColorError
nie znaleziono), ale udało mi się ustawićcolorError
atrybut w moim motywie. Wydaje się, że każda wersja Android / Support Library ma własne atrybuty motywu.<item name="colorError">@color/error</item>
Jedna uwaga dodatkowa. Wypróbowałem przyjęte rozwiązanie
errorTextAppereance
. Działa naprawdę dobrze, ale początkowo kolor podkreślenia danych wejściowych nie zmieniał się po zastosowaniu nowegoerrorTextAppereance
stylu. Widzę, że jest kilka komentarzy i że inni ludzie mają ten sam problem.W moim przypadku działo się tak, gdy ustawiałem nowy styl po ustawieniu nowego tekstu błędu. Lubię to:
passwordInputLayout.error = "Password strength" passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
Po zmianie kolejności tych dwóch metod tekst i kolor podkreślenia zmieniają się zgodnie z oczekiwaniami.
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple) passwordInputLayout.error = "Password strength"
A styl wyglądu tekstu błędu wygląda mniej więcej tak:
<style name="InputError" parent="TextAppearance.Design.Error"/> <style name="InputError.Purple"> <item name="android:textColor">@color/purple</item> </style>
źródło
Musiałem to robić dynamicznie. Korzystanie z odbicia:
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(); } }
Aby to zadziałało, musisz zadzwonić
textInputLayout.setErrorEnabled(true)
przed wywołaniem powyższej metody.źródło
W przypadku elementu
TextInputLayout
zawartego w bibliotece komponentów materiałów wystarczy użyćapp:errorTextColor
atrybutu.<com.google.android.material.textfield.TextInputLayout app:errorTextColor="@color/...." .../>
W niestandardowym stylu możesz użyć:
<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" > <item name="errorTextColor">@color/...</item> ... </style>
źródło
AKTUALIZACJA
Zmodyfikowana wersja odpowiedzi @ jared, która działa w moim przypadku:
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(); } }
źródło
Jeśli używasz com.google.android.material.textfield.TextInputLayout tego układu wejściowego, to wystarczy ustawić jeden styl
<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>
źródło
W zależności od potrzeb można zmieniać / ustawiać kolor tekstu TextInputLayout dynamicznie lub bezpośrednio w pliku XML układu. Poniżej znajdują się przykładowe fragmenty kodu
Utwórz styl niestandardowy, który używa @android: style / TextAppearance jako elementu nadrzędnego w pliku 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>
I użyj go w swoim widżecie TextInputLayout:
<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">
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);
Jeśli chcesz ustawić pojedynczy / ten sam kolor tekstu błędu dla swojej aplikacji, zdefiniuj kolor tekstu w motywie aplikacji
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Error text color... --> <item name="textColorError">@color/color_error</item> <!-- other styles... --> </style>
A w pliku AndroidManifest.xml:
<application android:theme="@style/AppTheme" android:icon="@drawable/ic_launcher" android:label="@string/your_app_name"> <!-- ... --> </application>
źródło
Zajrzałem do źródła TextInputLayout i zdałem sobie sprawę, że kolor tekstu błędu jest pobierany z colors.xml. Po prostu dodaj to do swojego colors.xml:
<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>
źródło