Zmień kolor wskazówki EditText podczas korzystania z TextInputLayout


146

Używam nowego TextInputLayoutz biblioteki projektów. Jestem w stanie pokazać i zmienić kolor pływającej etykiety. Niestety faktycznyEditText wskazówka jest teraz zawsze biała.

Próbowałem zmienić hintColor w XML, stylach i programowo, a także próbowałem użyć, android.support.v7.widget.AppCompatEditText ale EditTextpodpowiedź zawsze jest biała.

Oto mój plik XML dla mojego TextInputLayoutiEditText

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


    <EditText

    android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/city"
        android:textColorHint="@color/black"
        android:hint="@string/city" />

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

A oto styl, którego używam dla TextInputLayout(próbowałem uczynić hintTextColoratrybut czarnym, ale nic nie zrobiłem dla mnie):

<style name="GreenTextInputLayout" parent="@style/TextAppearance.AppCompat">
    <item name="android:textColor">@color/homestory_green</item>
</style>

Mam ten sam błąd. Wskazówka jest zawsze „BIAŁA” początkowo po dotknięciu dowolnego tekstu edycji, przyjmuje kolor zdefiniowany przez Ciebie. Wciąż szukam rozwiązania.
ch3tanz

Czy próbowałeś odpowiedzi @Ali Kabiri? Wygląda na to, że jest to lepsze rozwiązanie niż moje. Mój był bardzo specyficzny dla mojego projektu.
SamIAmHarris

Mam własny motyw i wszystkie kolory są zdefiniowane w style.xml
ch3tanz

Odpowiedzi:


164

Zdefiniuj android:textColorHintw motywie aplikacji:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>

    <item name="android:textColorHint">@color/secondary_text</item>
</style>

Źródło


@TheHungryAndroider czy ustawiłeś motyw jako motyw działania, w którym używasz tekstu edycji?
mbelsky

1
Działa dla mnie, ale kolor podpowiedzi nie jest ustawiony przy tworzeniu fragmentów i widoku, muszę kliknąć mój, EditTextaby ustawić kolor podpowiedzi na wszystkich wejściach w widoku ... nie znalazłem jeszcze żadnej poprawki ( requestFocus()i performClick()nie załatw niestety).
flawyte

1
działał, gdy został użyty jako atrybut: <EditText android: inputType = "textMultiLine" android: lines = "4" android: gravity = "top | right" android: layout_width = "fill_parent" android: layout_height = "match_parent" android: hint = " tekst podpowiedzi "android: textColorHint =" # 919389 "/>
masoud Cheragee

75

Utwórz własny styl w style.xml

<style name="EditTextHint" parent="TextAppearance.AppCompat">
    <item name="colorAccent">@android:color/white</item>
    <item name="android:textColorHint">@color/BackgroundtWhiteColor</item>
    <item name="colorControlNormal">@color/BackgroundtWhiteColor</item>
    <item name="colorControlActivated">@color/your color</item>
    <item name="colorControlHighlight">@color/BackgroundtWhiteColor</item>
</style>

Następnie w pliku XML układu dodaj atrybut motywu, jak poniżej

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

      <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

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

mam nadzieję, że to zadziała


4
Wyświetlany jest komunikat „Błąd podczas uzupełniania klasy EditText”. Proszę pomóż !
Mohit Khaitan

@Coder, niektóre z atrybutów, które dodał, dotyczą wieku 21+
Mr.O

49

Dodaj właściwość textColorHint do tekstu edycji

android:textColorHint="#F6F6F6"

lub w jakimkolwiek kolorze


41

mam ten sam problem. Rozwiązanie rozwiązane przez umieszczenie tych linii w motywie nadrzędnym .

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/ColorPrimaryDark</item>
    <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
    <item name="colorAccent">@color/AccentColor</item>
    <item name="android:windowTranslucentStatus">true</item>

    <item name="android:textColorHint">@color/BackgroundtWhiteColor</item>
    <item name="colorControlNormal">@color/BackgroundtWhiteColor</item>
    <item name="colorControlActivated">#ff0000</item>
    <item name="colorControlHighlight">@color/BackgroundtWhiteColor</item>
    <!-- Customize your theme here. -->
</style>

Jeśli to umieścisz

<item name="android:textColorHint">@color/BackgroundtWhiteColor</item>
<item name="colorControlNormal">@color/BackgroundtWhiteColor</item>
<item name="colorControlActivated">#ff0000</item>
<item name="colorControlHighlight">@color/BackgroundtWhiteColor</item>

w osobnym stylu i zastosuj go do TextInputLayout lub Edittext , nie pojawi się. Ty MASZ aby umieścić go w macierzystej temat aplikacji.


3
To naprawdę frustrujące, że nie możesz mieć wielu stylów wprowadzania w aplikacji za pomocą tego widżetu, ale o ile wiem, masz rację. : /
Turnsole

4
Cóż, nie jest konieczne, aby mieć go w całej aplikacji. Możesz zastosować ten motyw tylko do jednego działania w pliku manifestu. I stwórz inny motyw dla pozostałych swoich działań.
RexSplode

23

Nie jestem pewien, co powoduje twój problem - ten kod działa idealnie dla mnie. Myślę, że ma to coś wspólnego z używaniem poprawnej przestrzeni nazw xml ( xmlns). Nie jestem pewien, czy obsługiwane jest używanie android.support.design bez atrybutu przestrzeni nazw xml. Lub ma to coś wspólnego z textColorHintatrybutem, którego używasz w samym EditText.

Układ:

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

    <android.support.v7.widget.AppCompatEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="test"
        android:inputType="text" />
</android.support.design.widget.TextInputLayout>

Styl:

<style name="GreenTextInputLayout" parent="@android:style/TextAppearance">
    <item name="android:textColor">#00FF00</item>
</style>

2
To nadal działa tak, jak mam. Problem, który mam polega na tym, że zanim użytkownik dotknie EditText, kolor EditText jest biały. Gdy użytkownik dotknie EditText, etykieta TextInputLayout jest zielona i działa poprawnie.
SamIAmHarris

ten sam problem @ user3520299, czy masz szczęście w znalezieniu rozwiązania?
AhmedW,

Mój przypadek był wyjątkowy, ponieważ widok nadrzędny miał ustawiony motyw, który powodował problem. Ale kod, który umieściłem, działa dobrze teraz po usunięciu tego jednego motywu
SamIAmHarris

1
Działa to w przypadku pływającej wskazówki, ale nie w pustej kontrolce EditText. W tym celu zaktualizuj motyw aplikacji zgodnie z odpowiedzią @ mbelsky
Richard Le Mesurier

Nawiasem mówiąc, domyślną aplikacją jest: hintText Appearance style @style/TextAppearance.Design.Hint, więc możesz użyć tego jako swojego parentzamiast @android:style/TextAppearancelub@style/TextAppearance.AppCompat
rockgecko

19

Zapoznaj się z poniższym kodem, który zadziałał dla mnie, ale wpłynie to na wszystkie kolory kontrolek.

 <!-- In your style.xml file -->
    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
            <!--EditText hint color-->
            <item name="android:textColorHint">@color/default_app_white</item>
           <!-- TextInputLayout text color-->
            <item name="colorControlActivated">@color/default_app_green</item>
            <!-- EditText line color when EditText on-focus-->
            <item name="colorControlHighlight">@color/default_app_green</item>
            <!-- EditText line color when EditText  in un-focus-->
            <item name="colorControlNormal">@color/default_app_white</item>
        </style>

Należy to zaakceptować - pokazuje, jakie właściwości są wykorzystywane dla każdego z ważnych elementów.
Richard Le Mesurier

15

W TextInputLayout, który przechowuje EditText, dodaj:

android:textColorHint="someColor"

14

Wiele odpowiedzi, ale potrzebna jest tylko linia:

android: textColorHint = "# 000000"

    <EditText
        android:id="@+id/edtEmail"
        android:textColorHint="#000000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

10

android: textColorHint = "# FFFFFF" czasami działa, a czasami nie. U mnie poniższe rozwiązanie sprawdza się idealnie

Wypróbuj poniższy kod, który działa W Twoim pliku XML, a motyw TextLabel jest zdefiniowany w style.xml

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

     <EditText
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:hint="Floating Label"
         android:id="@+id/edtText"/>

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

W folderze stylów TextLabel Code

 <style name="MyTextLabel" parent="TextAppearance.AppCompat">
    <!-- Hint color and label color in FALSE state -->
    <item name="android:textColorHint">@color/Color Name</item> 
<!--The size of the text appear on label in false state -->
    <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>

Jeśli chcesz tylko zmienić kolor etykiety w fałszywym stanie, colorAccent, colorControlNormal i colorControlActivate nie są wymagane


10

Możesz użyć w android:textColorHint="@color/color_black"środku TextInputlayoutTo zadziałało dla mnie.

<android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/dp_10"
                android:textColorHint="@color/color_black"
                app:hintTextAppearance="@style/TextLabel">

                <EditText
                    android:id="@+id/et_state"
                    style="@style/profile_editTextStyle"

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

8

Zgodnie z tym: https://code.google.com/p/android/issues/detail?id=176559

Spróbuj tego:

<android.support.design.widget.TextInputLayout
    android:textColorHint="#A7B7C2"
    android:layout_width="match_parent"
    android:layout_height="50dp">

    <EditText
        android:id="@+id/et_confirm_password"
        android:textColor="@android:color/black"
        android:hint="Confirm password"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 </android.support.design.widget.TextInputLayout>

Działa w 23.1.1


6

Dzięki bibliotece Komponenty materiałów możesz dostosować TextInputLayoutkolor tekstu podpowiedzi, używając:

  • W układzie:

    • app:hintTextColor atrybut: kolor etykiety, gdy jest zwinięta, a pole tekstowe jest aktywne
    • android:textColorHint atrybut: kolor etykiety we wszystkich innych stanach pól tekstowych (takich jak spoczynkowe i wyłączone)

Coś jak:

<com.google.android.material.textfield.TextInputLayout
     app:hintTextColor="@color/mycolor"
     android:textColorHint="@color/text_input_hint_selector"
     .../>

wprowadź opis obrazu tutajwprowadź opis obrazu tutaj


5

Wygląda na to, że widok nadrzędny miał styl dla biblioteki innej firmy, który powodował, że tekst edycji był biały.

android:theme="@style/com_mixpanel_android_SurveyActivityTheme"

Po usunięciu tego wszystko działało dobrze.


5

spróbuj tego, może to pomoże

      edittext.addTextChangedListener(new  TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), "onTextChanged", 2000).show();;
            //newuser.setTextColor(Color.RED);
            edittext.setHintTextColor(Color.RED);

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), "afterTextChanged", 2000).show();;

        }
    });

dlaczego umieściłeś go w odbiorniku onTextChanged?
user25

5

późno, ale może to pomóc komuś, kogo zrobiłem w ten sposób

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginLeft="30dp"
        android:layout_marginStart="30dp"
        android:textColorHint="#8cffffff">

        <android.support.v7.widget.AppCompatEditText
            android:id="@+id/email_edit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/security_email"
            android:inputType="textEmailAddress"
            android:textColor="@color/white"
            app:backgroundTint="#8cffffff" />
    </android.support.design.widget.TextInputLayout>

4
<item name="colorAccent">@android:color/black</item>

zmień kolor Podkreśl żądany kolor w swoim motywie, zmieni to linię EditText, kursor, a także wskazówkę

lub możesz również dołączyć ten styl do swojego style.xml

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

następnie w swoim TextInputLayout możesz to umieścić w ten sposób

<android.support.design.widget.TextInputLayout
            android:id="@+id/input_layout_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/TextLabel">
            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@drawable/password"
                android:drawableStart="@drawable/password"
                android:maxLines="1"
                android:hint="password"
                android:inputType="textWebPassword" />

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

3
        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Name"
                android:textColor="@color/black"
                android:textColorHint="@color/grey"/>
        </android.support.design.widget.TextInputLayout>

Użyj textColorHint, aby ustawić żądany kolor jako kolor podpowiedzi dla EditText. Chodzi o to, że podpowiedź w EditText znika nie po wpisaniu czegoś, ale natychmiast, gdy EditText stanie się aktywny (z fajną animacją). Zauważysz to wyraźnie, gdy zmienisz fokus i przejdziesz do EditText.


3

Z dokumentacji:

Wskazówka powinna być ustawiona w TextInputLayout, a nie w EditText. Jeśli wskazówka jest określona w podrzędnym EditText w XML, TextInputLayout może nadal działać poprawnie; TextInputLayout użyje wskazówki EditText jako swojej pływającej etykiety. Jednak przyszłe wywołania zmiany wskazówki nie zaktualizują wskazówki TextInputLayout. Aby uniknąć niezamierzonego zachowania, wywołaj setHint (CharSequence) i getHint () na TextInputLayout, zamiast na EditText.

Spróbuj ustawić android:hinti app:hintTextColorna TextInputLayoutnie na TextInputEditText.



1
 <android.support.design.widget.TextInputLayout
        android:id="@+id/input_layout_passdword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColorHint="#d3d3d3">
        <EditText
            android:id="@+id/etaddrfess_ciwty"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:bottomLeftRadius="10dp"
            android:bottomRightRadius="50dp"
            android:fontFamily="@font/frutiger"
            android:gravity="start"
            android:hint="@string/address_city"
            android:padding="10dp"
            android:textColor="#000000"
            android:textColorHint="#000000"
            android:textSize="14sp"
            android:topLeftRadius="10dp"
            android:topRightRadius="10dp" />
    </android.support.design.widget.TextInputLayout>``

0

Wypróbuj poniższy kod:

Wysoki kolor światła to biały:

 <android.support.design.widget.TextInputLayout
        android:id="@+id/input_layout_mobile"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/TextStyle"
        >

        <EditText
            android:id="@+id/input_mobile"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:drawablePadding="14dp"
            android:drawableLeft="8dp"
            android:textColor="@color/white"
            android:hint="Mobile" />
    </android.support.design.widget.TextInputLayout>

style: TextStyle

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

0

Oto moje doświadczenia z podobnym problemem i wymaganym rozwiązaniem.

Wymaganie:

  • Konieczność dostosowania TextInputEditText(można powiedzieć, że niektóre powinny być przezroczyste, a inne nie, ale używać niestandardowych kolorów dla różnych wydarzeń)

Napotkany problem:

  • android:textColorHint nie działa zgodnie z wymaganiami.

Wypróbowane rozwiązania, które się nie powiodły:

  • Używany android:textColorHintw stylu i stosowany do TextInputEditText. Brak wyników lub różnicy.
  • Ustaw android:textColorHintw zastosowanym motywie aplikacji. Pomogło, ale zostało ustawione dla całej aplikacji. (Brak zgodności z wymaganiem)

Po wielu RnD, najlepszym znalezionym ROZWIĄZANIEM był artykuł, w którym opisano, że musimy zastosować motyw do TextInputLayoutlub do widoku rodzica, a nie tylko zastosować styl doTextInputEditText lub do widoku rodzica.

Proszę sprawdzić poprawne Theming TextInputLayout, który powiedział, że jesteśmy na złej drodze.


0

Kiedy próbowałem ustawić atrybut motywu na TextInputLayout, motyw był również stosowany do jego edittext widoku potomnego, czego nie chciałem.

Dlatego rozwiązaniem, które zadziałało, było dodanie własnego stylu do właściwości „app: hintTextAppearance” obiektu TextInputLayout.

W styles.xml dodaj następujący styl:

<style name="TextInputLayoutTextAppearance" parent="TextAppearance.AppCompat">
    <item name="android:textColor">@color/text_color</item>
    <item name="android:textSize">@dimen/text_size_12</item>
</style>

I zastosuj ten styl do właściwości „app: hintTextAppearance” obiektu TextInputLayout, jak poniżej:

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/mobile_num_til"
        android:layout_width="0dp"
        android:layout_height="@dimen/dim_56"
        app:layout_constraintStart_toStartOf="@id/title_tv"
        app:layout_constraintEnd_toEndOf="@id/title_tv"
        app:layout_constraintTop_toBottomOf="@id/sub_title_tv"
        android:layout_marginTop="@dimen/dim_30"
        android:padding="@dimen/dim_8"
        app:hintTextAppearance="@style/TextInputLayoutTextAppearance"
        android:background="@drawable/rect_round_corner_grey_outline">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/mobile_num_et"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:hint="@string/mobile_number"
            android:gravity="center_vertical"
            android:background="@android:color/transparent"/>

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

0

Jeśli korzystasz z nowej biblioteki Androidx Material Design com.google.android.material , możesz użyć colorstatelist do kontrolowania koloru tekstu podpowiedzi w stanie skupionym, najechanym i domyślnym w następujący sposób. (zainspirowany tym )

W res/color/text_input_box_stroke.xmlput coś jak następuje:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#fcc" android:state_focused="true"/>
    <item android:color="#cfc" android:state_hovered="true"/>
    <item android:color="#ccf"/>
</selector>

Wtedy w swoim styles.xmlumieściłbyś:

<style name="MtTILStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
    <item name="boxStrokeColor">@color/text_input_box_stroke</item>
    <item name="hintTextColor">@color/text_input_box_stroke</item>
</style>

Na koniec wskaż swój styl w rzeczywistym TextInputLayout Z jakiegoś powodu musisz również ustawić android:textColorHintdomyślny kolor podpowiedzi:

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/my_layout_id"
    style="@style/LoginTextInputLayoutStyle"
    android:textColorHint="#ccf"
    ...

0

jeśli używasz biblioteki Material Design. Obecnie używam wersji

wdrożenie „com.google.android.material: material: 1.3.0-alpha01”

1 - Ustaw kolor, gdy TextInputLayout jest w stanie spoczynku.

<item name="android:textColorHint">@color/your_color_hint</item>

2 - Ustaw kolor, gdy TextInputLayout jest zmienny / skoncentrowany / dotknięty.

<item name="hintTextColor">@color/your_color_floating_hint</item>

3 - Ustaw kolor linii w obszarze TextInputLayout.

<item name="boxStrokeColor">@color/TextViewColor_line</item>

4 - Ustaw kolor błędu w obszarze TextInputLayout.

<item name="boxStrokeErrorColor">@color/colorPrimary</item>

0

Chciałem tylko zmienić kolor etykiety, gdy jest podniesiona do góry. Ale ustawienie textColorHintzmienia kolor w każdym stanie. Więc to zadziałało dla mnie:

   <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
       ...
        <item name="colorControlActivated">@color/colorPrimary</item>
       ...
    </style>

Spowoduje to zmianę koloru, gdy wejście jest skupione.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.