So ändern Sie die Farbe der schwebenden Beschriftung von TextInputLayout


209

TextInputLayoutWie ändere ich in Bezug auf die neue Version von Google die Farbe des schwebenden Etikettentextes?

Einstellung colorControlNormal, colorControlActivated, colorControlHighLightin verschiedenen Schnitten nicht hilft.

Das habe ich jetzt:

Das habe ich jetzt


8
Wie ändern Sie die Linienfarbe in Rot?
Vlad

6
@ Vlad161 colorAccent
Kyle Horkley

@ Vlad161 könnte erklären, wo Sie setzen würden colorAccent? Ich habe den benutzerdefinierten Stil colorAccentin Schwarz geändert und die Linie würde immer noch das widerspiegeln, was ich colorControlNormalim Hauptstil habe.
ElliotM

2
Hier ein gutes Beispiel gefunden
Chintan Rathod

Überprüfen Sie den folgenden Link. Es stellte die verschiedene Farbe ein, um Farbe
anzudeuten

Antworten:


357

Versuchen Sie den folgenden Code, der im Normalzustand funktioniert

 <android.support.design.widget.TextInputLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:theme="@style/TextLabel">

     <android.support.v7.widget.AppCompatEditText
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:hint="Hiiiii"
         android:id="@+id/edit_id"/>

 </android.support.design.widget.TextInputLayout>

Im Stilordner TextLabel Code

 <style name="TextLabel" parent="TextAppearance.AppCompat">
    <!-- Hint color and label color in FALSE state -->
    <item name="android:textColorHint">@color/Color Name</item> 
    <item name="android:textSize">20sp</item>
    <!-- Label color in TRUE state and bar color FALSE and TRUE State -->
    <item name="colorAccent">@color/Color Name</item>
    <item name="colorControlNormal">@color/Color Name</item>
    <item name="colorControlActivated">@color/Color Name</item>
 </style>

Auf Hauptthema der App setzen, funktioniert es nur Hervorheben des Status

 <item name="colorAccent">@color/Color Name</item>

Aktualisieren:

UnsupportedOperationException: Kann nicht in Farbe konvertiert werden: Typ = 0x2 in API 16 oder niedriger

Lösung


6
Wow, ich arbeite jetzt seit ungefähr einer Woche daran - ich bin mehrmals auf diese Frage zurückgekommen, Sie haben gerade alle Fragen beantwortet, die ich jemals hatte.
ElliotM

40
App gestürzt, wenn Sie eine Fehlermeldung in TextInputLayout oder unter der EditText-Ansicht festlegen:android.view.InflateException: Error inflating class TextView
Arvis

18
Wenn Sie diesen android:themeStil aktivieren, TextInputLayoutführt dies zu InflateExceptionAbstürzen auf ASUS Zenphones (und möglicherweise anderen Geräten).
Friederbluemle

13
Hallo nj, Sorry für das, ich weiß nicht , warum es passiert ist , aber ich geändert TextAppearance.AppCompat zu ThemeOverlay.AppCompat.Light es Arbeiten ist in Ordnung , auch wenn es gesetzt Fehler textinputlayout mit
Brahmam Yamani

11
Einstellen der Eltern zur ThemeOverlay.AppCompat.LightLösung des Absturzes auf meinem ASUS Zenphone (@friederbluemle)
Lukasz Wiktor

103
<style name="TextAppearance.App.TextInputLayout" parent="@android:style/TextAppearance">
    <item name="android:textColor">@color/red</item>
    <item name="android:textSize">14sp</item>
</style>

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColorHint="@color/gray"  //support 23.0.0
    app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout" >

    <android.support.v7.widget.AppCompatEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint" />
</android.support.design.widget.TextInputLayout>

16
Dies entspricht der akzeptierten Antwort, außer mit der irreführenden Implikation, dass Sie AppCompatEditText verwenden müssen. AppCompatActivity verwendet AppCompatEditText automatisch für EditText-Instanzen. Sie müssen dies nicht speziell verwenden.
Niall

4
Die erste Codezeile oben direkt nach "<style name" ist falsch geschrieben. Ich glaube, "... TextAppearence ..." sollte "... TextAppearance ..." sein
AJW

android:textColorHint="@color/gray" //support 23.0.0machte meine Hinweistextfarbe sichtbar (die Hinweistextfarbe war standardmäßig schwarz, unabhängig von der von mir festgelegten Hinweistextfarbe, und wenn der Hintergrund schwarz ist, ist der Text vollständig ausgeblendet
Rajaraman

69

Wenn Sie die Antwort gefunden haben, verwenden Sie das android.support.design:hintTextAppearanceAttribut, um Ihr eigenes Erscheinungsbild für schwebende Etiketten festzulegen.

Beispiel:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:hintTextAppearance="@style/TextAppearance.AppCompat">

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/prompt_password"/>
</android.support.design.widget.TextInputLayout>

Schöne flüssige Animation. Vielen Dank
Joaquin Iurchuk

Ich verstehe Namespace 'android.support.design' not bound. Irgendwelche Vorschläge?
Sunkas

@ Sunkas compile 'com.android.support:design:23.1.1'zu Ihrer App Gradle-Datei hinzufügen
Ahmed Mostafa

23

Sie müssen android:theme="@style/TextInputLayoutTheme"die schwebende Beschriftungsfarbe nicht verwenden, da sie sich auf das gesamte Thema für die kleine Textansicht auswirkt, die als Beschriftung verwendet wird. Stattdessen können Sie Folgendes verwenden app:hintTextAppearance="@style/TextInputLayout.HintText":

<style name="TextInputLayout.HintText">
  <item name="android:textColor">?attr/colorPrimary</item>
  <item name="android:textSize">@dimen/text_tiny_size</item>
  ...
</style>

Lassen Sie mich wissen, ob die Lösung funktioniert :-)


22

Wie ändere ich die Farbe des schwebenden Etikettentextes?

Mit der Materialkomponentenbibliothek können Sie die TextInputLayoutFarbe des Hinweistextes mithilfe von anpassen (es ist die Version 1.1.0 erforderlich).

  • Im Layout:

    • app:hintTextColor Attribut: Die Farbe des Etiketts, wenn es reduziert ist und das Textfeld aktiv ist
    • android:textColorHint Attribut: Die Farbe der Beschriftung in allen anderen Textfeldzuständen (z. B. Ruhezustand und Deaktiviert).
<com.google.android.material.textfield.TextInputLayout
     app:hintTextColor="@color/mycolor"
     android:textColorHint="@color/text_input_hint_selector"
     .../>
  • Erweiterung eines Materialstils Widget.MaterialComponents.TextInputLayout.* :
<style name="MyFilledBox" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
    <item name="hintTextColor">@color/mycolor</item>
    <item name="android:textColorHint">@color/text_input_hint_selector</item>
</style>

Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein

Die Standardauswahl für android:textColorHintist:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:alpha="0.38" android:color="?attr/colorOnSurface" android:state_enabled="false"/>
  <item android:alpha="0.6" android:color="?attr/colorOnSurface"/>
</selector>


4

Ok, ich fand diese Antwort sehr hilfreich und danke allen, die dazu beigetragen haben. Nur um etwas hinzuzufügen. Die akzeptierte Antwort ist in der Tat die richtige Antwort ... ABER ... in meinem Fall wollte ich die Fehlermeldung unter dem EditTextWidget mit implementieren app:errorEnabled="true"und diese einzelne Zeile machte mir das Leben schwer. Es scheint, dass dies das von mir gewählte Thema überschreibt, für android.support.design.widget.TextInputLayoutdas eine andere Textfarbe definiert ist android:textColorPrimary.

Am Ende habe ich eine Textfarbe direkt auf das EditTextWidget angewendet. Mein Code sieht ungefähr so ​​aus:

styles.xml

<item name="colorPrimary">@color/my_yellow</item>
<item name="colorPrimaryDark">@color/my_yellow_dark</item>
<item name="colorAccent">@color/my_yellow_dark</item>
<item name="android:textColorPrimary">@android:color/white</item>
<item name="android:textColorSecondary">@color/dark_gray</item>
<item name="android:windowBackground">@color/light_gray</item>
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:textColorHint">@color/dark_gray</item>
<item name="android:colorControlNormal">@android:color/black</item>
<item name="android:colorControlActivated">@android:color/white</item>

Und mein Widget:

<android.support.design.widget.TextInputLayout
        android:id="@+id/log_in_layout_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:errorEnabled="true">

        <EditText
            android:id="@+id/log_in_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textColor="@android:color/black"
            android:ems="10"
            android:hint="@string/log_in_name"
            android:inputType="textPersonName" />
</android.support.design.widget.TextInputLayout>

Jetzt wird anstelle des textColorPrimaryWeiß eine schwarze Textfarbe angezeigt .


3

Ich schlage vor, Sie erstellen ein Stilthema für TextInputLayout und ändern nur die Akzentfarbe. Legen Sie das übergeordnete Element für Ihr App-Basisthema fest:

 <style name="MyTextInputLayout" parent="MyAppThemeBase">
     <item name="colorAccent">@color/colorPrimary</item>
 </style>

 <android.support.design.widget.TextInputLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:theme="@style/MyTextInputLayout">

2

Verwendet in der neuesten Version der Unterstützungsbibliothek (23.0.0+) TextInputLayoutdas folgende Attribut in XML, um die Farbe der schwebenden Beschriftung zu bearbeiten:android:textColorHint="@color/white"


2

Anstelle der Antwort von Brahmam Yamani bevorzuge ich Widget.Design.TextInputLayout als übergeordnetes Element. Dadurch wird sichergestellt, dass alle erforderlichen Elemente vorhanden sind, auch wenn nicht alle Elemente überschrieben werden. In der Antwort von Yamanis stürzt die App mit einer nicht auflösbaren Ressource ab, wenn setErrorEnabled (true) aufgerufen wird.

Ändern Sie einfach den Stil wie folgt:

<style name="TextLabel" parent="Widget.Design.TextInputLayout">
    <!-- Hint color and label color in FALSE state -->
    <item name="android:textColorHint">@color/Color Name</item> 
    <item name="android:textSize">20sp</item>
    <!-- Label color in TRUE state and bar color FALSE and TRUE State -->
    <item name="colorAccent">@color/Color Name</item>
    <item name="colorControlNormal">@color/Color Name</item>
    <item name="colorControlActivated">@color/Color Name</item>
 </style>

1
funktioniert gut auf Android 4.3 und 7, keine Fehler bei der Verwendung von EditText.setError ()
Saul_programa

2

In meinem Fall habe ich dies " app:hintTextAppearance="@color/colorPrimaryDark"in meinem TextInputLayout-Widget hinzugefügt .


Das funktioniert nicht. error: '#FFFFFF' is incompatible with attribute hintTextAppearance
Taslim Oseni

1

So ändern Sie die Farbe des Hinweises und bearbeiten die Farbe des unterstrichenen Textes: colorControlActivated

So ändern Sie die Farbe des Zeichenzählers: textColorSecondary

So ändern Sie die Farbe der Fehlermeldung: colorControlNormal

So ändern Sie den Farbton der Schaltfläche für die Kennwortsichtbarkeit: colorForeground

Weitere Informationen zu TextInputLayout finden Sie unter http://www.zoftino.com/android-textinputlayout-tutorial

<style name="MyAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorControlActivated">#e91e63</item>
    <item name="android:colorForeground">#33691e</item>
    <item name="colorControlNormal">#f57f17</item>
    <item name="android:textColorSecondary">#673ab7</item>
</style>

1

Programmatisch können Sie verwenden:

/* Here you get int representation of an HTML color resources */
int yourColorWhenEnabled = ContextCompat.getColor(getContext(), R.color.your_color_enabled);
int yourColorWhenDisabled = ContextCompat.getColor(getContext(), R.color.your_color_disabled);

/* Here you get matrix of states, I suppose it is a matrix because using a matrix you can set the same color (you have an array of colors) for different states in the same array */
int[][] states = new int[][]{new int[]{android.R.attr.state_enabled}, new int[]{-android.R.attr.state_enabled}};

/* You pass a ColorStateList instance to "setDefaultHintTextColor" method, remember that you have a matrix for the states of the view and an array for the colors. So the color in position "colors[0x0]" will be used for every states inside the array in the same position inside the matrix "states", so in the array "states[0x0]". So you have "colors[pos] -> states[pos]", or "colors[pos] -> color used for every states inside the array of view states -> states[pos] */
myTextInputLayout.setDefaultHintTextColor(new ColorStateList(states, new int[]{yourColorWhenEnabled, yourColorWhenDisabled})

Erklärung:

Holen Sie sich den int-Farbwert von einer Farbressource (eine Möglichkeit, die von Android verwendeten RGB-Farben darzustellen). Ich habe ColorEnabled geschrieben, aber für diese Antwort sollte es eigentlich ColorHintExpanded & ColorViewCollapsed sein. Auf jeden Fall ist dies die Farbe, die Sie sehen, wenn sich der Hinweis einer Ansicht "TextInputLayout" im Status "Erweitert" oder "Reduziert" befindet. Sie legen es fest, indem Sie das nächste Array für die Funktion "setDefaultHintTextColor" der Ansicht verwenden. Referenz: Referenz für TextInputLayout - Suchen Sie auf dieser Seite nach der Methode "setDefaultHintTextColor", um weitere Informationen zu erhalten

Wenn Sie sich die obigen Dokumente ansehen, können Sie sehen, dass die Funktionen die Farben für den erweiterten und reduzierten Hinweis mithilfe einer ColorStateList festlegen.

ColorStateList-Dokumente

Um die ColorStateList zu erstellen, habe ich zuerst eine Matrix mit den gewünschten Status erstellt, in meinem Fall state_enabled & state_disabled (die in TextInputLayout gleich Hint Expanded und Hint Collapsed sind [Ich erinnere mich nicht, in welcher Reihenfolge lol, jedenfalls habe ich sie gefunden mache nur einen Test]). Dann übergebe ich die Arrays mit int-Werten der Farbressourcen an den Konstruktor der ColorStateList. Diese Farben entsprechen der Zustandsmatrix (jedes Element im Farbarray entspricht dem jeweiligen Array in der Zustandsmatrix an derselben Position). Das erste Element des Farbarrays wird also als Farbe für jeden Status im ersten Array der Statusmatrix verwendet (in unserem Fall hat das Array nur 1 Element: enabled state = erweiterter Hinweisstatus für TextInputLayut). Letzte Dinge Zustände haben positive / negative Werte, und Sie haben nur die positiven Werte,

Hoffe das ist hilfreich. Tschüss, hab eine schöne Codierung (:


Erklärung? Dies sind nur 2 Methoden: / Wie auch immer, ok, ich füge sie schnell hinzu.
Z3R0

Nur vier Zeilen mit viel Text - erklären Sie einfach kurz die Konzepte dahinter und jeder hat einen guten Grund, eine positive Bewertung abzugeben :)
Nico Haase

1
Fertig;) Hoffe es ist richtig und hilfreich. Haben Sie eine schöne Codierung: D
Z3R0

0

Sie sollten hier Ihre Farbe ändern

<style name="Base.Theme.DesignDemo" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">#673AB7</item>
        <item name="colorPrimaryDark">#512DA8</item>
        <item name="colorAccent">#FF4081</item>
        <item name="android:windowBackground">@color/window_background</item>
    </style>

0

Jetzt einfach verwenden colorAccentund colorPrimarywird perfekt funktionieren.


4
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Swati

2
@ Swati Dies ist eine Antwort auf die Frage. Ich sage ihm, er soll colorAccent und colorPrimary verwenden.
Kyle Horkley

6
Nun, es ist eher ein Kommentar. Sie können einen Punkt haben, wenn Sie einen Beispielcode hinzufügen.
Sufian

Tatsächlich hat TextInputLayout genau colorPrimarydas Thema übernommen, um die fokussierte Farbe des Hinweises und der unteren Zeile festzulegen . Obwohl es wirklich eine Erklärung / einen Code geben sollte, um es in dieser Antwort zu präsentieren
Kirill Starostin

0

Ich löse das Problem. Dies ist Layout:

 <android.support.design.widget.TextInputLayout
           android:id="@+id/til_username"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:hint="@string/username"
           >

           <android.support.v7.widget.AppCompatEditText android:id="@+id/et_username"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:singleLine="true"
               />
       </android.support.design.widget.TextInputLayout>

Das ist Stil:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>
<!-- Application theme. -->


 <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="colorAccent">@color/pink</item>
        <item name="colorControlNormal">@color/purple</item>
        <item name="colorControlActivated">@color/yellow</item>
    </style>

Sie sollten Ihr Thema in der Anwendung verwenden:

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

0

um die Farbe der Textbeschriftung zu ändern, wenn Sie sich darauf konzentrieren. dh es eingeben. Sie müssen angeben hinzufügen

<item name="android:textColorPrimary">@color/yourcolorhere</item>

Nur eine Anmerkung: Sie müssen alle diese Implementierungen zu Ihrem Hauptthema hinzufügen.


0

Es funktioniert für mich ..... füge Hinweisfarbe in TextInputLayout hinzu

    <android.support.design.widget.TextInputLayout
        android:textColorHint="#ffffff"
        android:id="@+id/input_layout_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/edtTextPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:hint="Password"
            android:inputType="textPassword"
            android:singleLine="true"
            />
    </android.support.design.widget.TextInputLayout>

0

Ich habe versucht, android: textColorHint in der android.support.design.widget.TextInputLayout zu verwenden, es funktioniert gut.

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColorHint="@color/colorAccent">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Hello"
                android:imeActionLabel="Hello"
                android:imeOptions="actionUnspecified"
                android:maxLines="1"
                android:singleLine="true"/>

        </android.support.design.widget.TextInputLayout>

0
  <style name="AppTheme2" parent="AppTheme">
    <!-- Customize your theme here. -->
    <item name="colorControlNormal">#fff</item>
    <item name="colorControlActivated">#fff</item></style>    

füge dies zu Stilen hinzu und setze TextInputLayout Theam auf App2 und es wird funktionieren;)


0
<com.google.android.material.textfield.TextInputLayout
    android:hint="Hint"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/TextInputLayoutHint">

    <androidx.appcompat.widget.AppCompatEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:maxLines="1"
        android:paddingTop="@dimen/_5sdp"
        android:paddingBottom="@dimen/_5sdp"
        android:textColor="#000000"
        android:textColorHint="#959aa6" />

</com.google.android.material.textfield.TextInputLayout>

res / values ​​/ styles.xml

<style name="TextInputLayoutHint" parent="">
    <item name="android:textColorHint">#545454</item>
    <item name="colorControlActivated">#2dbc99</item>
    <item name="android:textSize">11sp</item>
</style>

0

Kann verwenden, app:hintTextColorwenn Sie verwenden com.google.android.material.textfield.TextInputLayout, versuchen Sie dies

 <com.google.android.material.textfield.TextInputLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:hint="@string/app_name" 
     app:hintTextColor="@android:color/white">                   

     <com.google.android.material.textfield.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
 </com.google.android.material.textfield.TextInputLayout>

0

Versuchen Sie den folgenden Code, der im Normalzustand funktioniert

<android.support.design.widget.TextInputLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:theme="@style/TextLabel">

 <android.support.v7.widget.AppCompatEditText
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:hint="Hiiiii"
     android:id="@+id/edit_id"/>


</android.support.design.widget.TextInputLayout>

Im Stilordner TextLabel Code

 <style name="TextLabel" parent="TextAppearance.AppCompat">
<!-- Hint color and label color in FALSE state -->
<item name="android:textColorHint">@color/Color Name</item> 
<item name="android:textSize">20sp</item>
<!-- Label color in TRUE state and bar color FALSE and TRUE State -->
<item name="colorAccent">@color/Color Name</item>
<item name="colorControlNormal">@color/Color Name</item>
<item name="colorControlActivated">@color/Color Name</item>
 </style>

0

Aus der Dokumentation:

Der Hinweis sollte im TextInputLayout und nicht im EditText festgelegt werden. Wenn für den untergeordneten EditText in XML ein Hinweis angegeben ist, funktioniert das TextInputLayout möglicherweise weiterhin ordnungsgemäß. TextInputLayout verwendet den Hinweis von EditText als schwebende Bezeichnung. Bei zukünftigen Aufrufen zum Ändern des Hinweises wird der Hinweis von TextInputLayout jedoch nicht aktualisiert. Um unbeabsichtigtes Verhalten zu vermeiden, rufen Sie setHint (CharSequence) und getHint () in TextInputLayout anstelle von EditText auf.

Also habe ich eingestellt android:hintund app:hintTextColorweiter TextInputLayout, nicht weiter TextInputEditTextund es hat funktioniert.


0

Da müssen Sie hinzufügen colorControlNormal, colorControlActivated, colorControlHighLightArtikel zum Hauptthema:

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

        <item name="colorControlActivated">@color/yellow_bright</item>
        <item name="colorControlNormal">@color/yellow_black</item>

    </style>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.