Wie lege ich die Farbe der TextInputLayout-Fehlermeldung fest?

89

Wie kann ich die Farbe der Fehlermeldung ändern, die so eingestellt werden kann, dass sie unter dem Textfeld in einem TextInputLayoutangezeigt wird (via setError(...)- siehe Fehlerstatus hier )?

Es zeigt sich normalerweise als rote Farbe, die ich ändern möchte. Welche Artikelnamen / Schlüssel sollte ich in meiner styles.xmlDatei verwenden, um die Farbe zu bestimmen?

Danke im Voraus.


Bearbeiten:

app:errorTextAppearanceSchlüssel zu meinem hinzugefügt 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>

und das Auftreten des Fehlers (zum Testen auf grün gesetzt) :

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

Das Ergebnis ist, dass sowohl der Hinweis als auch die Fehlermeldung farbig sind (Screenshots vom skalierten Android Emulator) :

Normal (kein Fehler):

Vor dem Bild

Fehlerstatus:

Nach dem Bild

Bearbeiten 2 / Ergebnis:

Wenn die Fehlermeldung angezeigt wird, ändert sich der Hinweis über dem Feld in dieselbe Farbe wie die Fehlermeldung und überschreibt die Hinweisfarbe - dies ist beabsichtigt.

Seb Jachec
quelle
Die Fehlerfarbe ersetzt die Hinweisfarbe im Fehlerzustand. Dies ist beabsichtigt. Siehe google.com/design/spec/components/… Sie können dies nicht umgehen, ohne die TextInputLayout-Klasse zu ändern.
Eugen Pechanec
@ EugenPechanec Ich wusste nicht, dass dies der Fall ist. Vielen Dank für die Erklärung
Seb Jachec
1
@ EugenPechanec Ich bin mir ziemlich sicher, dass Sie hier falsch liegen. Der Teil, auf den Sie sich beziehen, stammt vom Zeichenzähler. Für normale Felder sollten Fehler wie auf diesem Bild aussehen (beachten Sie, dass der Hinweis nicht farbig ist) material-design.storage.googleapis.com/publish/material_v_4/…
Arkadiusz 'fliegt' Rzadkowolski
2
@ EugenPechanec code.google.com/p/android/issues/detail?id=195775 - es war tatsächlich ein Fehler und wird in der zukünftigen Version behoben :)
Arkadiusz 'fliegt' Rzadkowolski

Antworten:

140

Erstellen Sie einen benutzerdefinierten Stil, der @android:style/TextAppearanceals übergeordnetes Element in Ihrer styles.xmlDatei verwendet wird:

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

Und verwenden Sie es in Ihrem TextInputLayout-Widget:

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

Fehlerbeispiel

Edit: Stellen Sie den Hinweis auf das Objekt, das in Ihrem TextInputLayout ist ( EditText, TextViewusw.) verschiedene Farben für den Hinweis und den Fehler zu halten.

dabo248
quelle
1
Vielen Dank. Scheint unkompliziert, konnte es aber irgendwie nicht für mein Leben finden!
Seb Jachec
2
Update: Kann man einfach das Styling der Fehlermeldung ändern? Dies scheint auch den Hinweisstil über dem Feld zu ändern.
Seb Jachec
"Ja wirklich?" Nicht für mich, schau dir das Bild oben an. Sind Sie sicher, dass Sie den Stil zuweisen app:errorTextAppearance?
dabo248
1
@EugenPechanec Vereinfacht sieht es so aus : <android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>. Ja, es ist eine andere Textansicht, deshalb wird die Fehlerfarbe nicht aus dem TextInputLayout übernommen.
dabo248
7
Wenn Sie nur die Farbe ändern möchten, stellen Sie den Stil am besten parentauf ein parent="TextAppearance.Design.Error". Auf diese Weise bleiben die Standardtextgröße und alle anderen Attribute erhalten. Sie können jedoch die Fehlerfarbe, die das Ziel der vorliegenden Frage war, speziell anpassen.
w3bshark
28

Eigentlich nur die Fehlermeldung Farbe zu ändern, können Sie einstellen , textColorErrorin Ihrem Thema (und auch festgelegt colorControlNormalund colorControlActivatedfür die allgemeine Widget und Hinweistext Farbe). TextInputLayoutnimmt dieses Attribut auf. HINWEIS: Wenn Sie errorTextAppearanceeinen benutzerdefinierten Stil festlegen , textColorErrorhat dies keine Auswirkungen.

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

Und in Ihrer AndroidManifest.xml:

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

    <!-- ... -->

</application>
Vicky Chijwani
quelle
16
Jemand sollte wirklich ein Buch über Themen und Stile und alle möglichen Attribute schreiben. Das ist wirklich verrückt, man kann Farbe und Stil auf so viele Arten einstellen, und es gibt keine Möglichkeit zu wissen, welcher Weg der richtige ist. Und natürlich gibt es überhaupt keine Dokumentation :( Ich meine, es gibt, aber es ist wirklich verwirrend.
Aleksamarkoni
Dies ist eine viel bessere Antwort als die mit der höheren Punktzahl!
Philthomas26
6
Für mich verursachte diese Lösung einen Fehler ( textColorErrornicht gefunden), aber ich konnte das colorErrorAttribut in meinem Thema festlegen . Anscheinend hat jede Version von Android / Support Library ihre eigenen Themenattribute.
Slawischer
9
Ich bekomme 'Android-Ressourcenverknüpfung fehlgeschlagen', aber mit <item name="colorError">@color/error</item>funktioniert gut
m4n3k4s
4
Bitte aktualisieren Sie den Beitrag. TextColorError ist jetzt colorError.
Matt Wolfe
7

Eine Randnotiz. Ich habe die akzeptierte Lösung mit ausprobiert errorTextAppereance. Es funktioniert wirklich gut, aber zuerst änderte sich die Farbe der eingegebenen Unterstreichung nicht, nachdem ein neuer errorTextAppereanceStil angewendet wurde. Ich sehe, dass es einige Kommentare gibt und dass andere Leute das gleiche Problem haben.

In meinem Fall geschah dies, als ich nach dem Festlegen eines neuen Fehlertextes einen neuen Stil festlegte. So was:

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

Nach dem Ändern der Reihenfolge dieser beiden Methoden ändert sich die Text- und Unterstreichungsfarbe wie erwartet.

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

Und der Fehlertext-Darstellungsstil sieht ungefähr so ​​aus:

<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
    <item name="android:textColor">@color/purple</item>
</style>
Ivan Marić
quelle
Wie sieht Ihr R.style.InputError_Purple aus?
toobsco42
Der @ toobsco42-Stil definiert nur die Textfarbe. Ich habe die Antwort mit der tatsächlichen Implementierung bearbeitet.
Ivan Marić
Danke dir! Ich benutze diese Ansicht sowohl für einen gültigen Text als auch für einen Fehlertext (grün und rot) und die Unterstreichungsfarbe, die sich nicht richtig ändert, hat mich verrückt gemacht.
Rexar5
6

Ich musste das dynamisch machen. Reflexion verwenden:

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();
  }
}

Sie müssen aufrufen, textInputLayout.setErrorEnabled(true)bevor Sie die obige Methode aufrufen, damit dies funktioniert.

Jared Rummler
quelle
Die Fehlertextfarbe ändert sich, aber die Unterstreichungsfarbe bleibt erhalten. Sie ändert sich erst beim nächsten Aufruf derselben Funktion
Mohammad Shabaz Moosa
@ Dr.aNdRO Dies verwendet Reflexion, es ist nicht garantiert, dass es immer funktioniert!
ucMedia
2

Verwenden Sie mit dem TextInputLayoutin der Material Components Library enthaltenenapp:errorTextColor Attribut einfach das Attribut.

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

In einem benutzerdefinierten Stil können Sie Folgendes verwenden:

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

Geben Sie hier die Bildbeschreibung ein

Gabriele Mariotti
quelle
1

AKTUALISIEREN

Bitte verwenden Sie stattdessen eine benutzerdefinierte Ansicht und nicht diese


Eine modifizierte Version von @ jareds Antwort, die in meinem Fall funktioniert:

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();
    }
}
Dr. aNdRO
quelle
Die Fehlertextfarbe ändert sich, aber die Unterstreichungsfarbe bleibt erhalten. Sie ändert sich erst beim nächsten Aufruf derselben Funktion
Mohammad Shabaz Moosa
2
Verwenden Sie dies nicht. Dies ist
derzeit
0

Wenn Sie com.google.android.material.textfield.TextInputLayout dieses Eingabelayouts verwenden, legen Sie nur einen Stil fest

<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>
Mohit Suthar
quelle
0

Je nach Bedarf kann die Textfarbe von TextInputLayout dynamisch oder direkt in der Layout-XML-Datei geändert / festgelegt werden. Unten finden Sie Beispielcode-Schnipsel

Erstellen Sie einen benutzerdefinierten Stil, der @android: style / TextAppearance als übergeordnetes Element in Ihrer Datei styles.xml verwendet:

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

Verwenden Sie es in Ihrem TextInputLayout-Widget:

  1. Direkt im XML-Layout
 <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. Dynamisch in deiner Klasse
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);

Wenn Sie eine einzelne / dieselbe Fehlertextfarbe für Ihre Anwendung festlegen möchten, definieren Sie die Textfarbe in Ihrem App-Design

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

Und in Ihrer AndroidManifest.xml:

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

    <!-- ... -->

</application>
Rupesh Yadav
quelle
-2

Ich habe in die TextInputLayout-Quelle geschaut und festgestellt, dass die Farbe des Fehlertextes aus color.xml stammt. Fügen Sie dies einfach Ihrer colours.xml hinzu:

<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>
Java Geek
quelle
Funktioniert für mich mit hinzugefügter Designbibliothek.
Java Geek