TextInputLayout hata mesajı rengi nasıl ayarlanır?


93

Bir metin alanının altında görüntülenecek şekilde ayarlanabilen hata mesajının rengini nasıl değiştirebilirim TextInputLayout( buradansetError(...) - hata durumuna bakın )?

Normalde değiştirmek istediğim kırmızı bir renkle gösterilir. styles.xmlRengi hedeflemek için dosyamda hangi öğe adlarını / anahtarlarını kullanmalıyım ?

Şimdiden teşekkürler.


Düzenle:

app:errorTextAppearanceBenim için anahtar eklendi 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>

ve hata görünümü (test için yeşile ayarlanır) :

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

Sonuç olarak, ipucunun yanı sıra hata mesajı da renklidir (ölçeklendirilmiş Android Emülatöründen ekran görüntüleri) :

Normal (hata yok):

Görüntüden Önce

Hata durumu:

Görüntüden Sonra

Düzenleme 2 / Sonuç:

Hata mesajı göründüğünde, alanın üzerindeki ipucu, hata mesajıyla aynı renge dönüşerek ipucu rengini geçersiz kılar - bu tasarım gereğidir.



Hata rengi, hata durumunda ipucu renginin yerini alır. Bu tasarım gereğidir. Bkz. Google.com/design/spec/components/… TextInputLayout sınıfını değiştirmeden bu sorunu çözemezsiniz.
Eugen Pechanec

@EugenPechanec Durumun bu olduğunu bilmiyordum.
Açıkladığınız

1
@EugenPechanec Burada yanıldığınızdan oldukça eminim. Bahsettiğiniz kısım karakter sayacından. Normal alanlar için hatalar bu resimdeki gibi görünmelidir (ipucunun renkli olmadığına dikkat edin) material-design.storage.googleapis.com/publish/material_v_4/…
Arkadiusz 'sinekler' Rzadkowolski

2
@EugenPechanec code.google.com/p/android/issues/detail?id=195775 - bu gerçekten bir hataydı ve gelecekteki sürümde düzeltilecek :)
Arkadiusz 'uçuyor' Rzadkowolski

Yanıtlar:


143

Dosyanızda @android:style/TextAppearanceana öğe olarak kullanılan özel bir stil oluşturun 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>

Ve bunu TextInputLayout widget'ınızda kullanın:

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

hata örneği

Düzenleme: senin TextInputLayout (içinde olan nesne, üzerine ipucu Set EditText, TextViewipucu ve hata için farklı renkler tutmak için, vs.).


1
Teşekkürler. Basit görünüyor ama bir şekilde hayatım boyunca bulamadı!
Seb Jachec

2
Güncelleme: Hata mesajının sadece stilini değiştirmek mümkün müdür? Bu, alanın üzerindeki ipucu stilini de değiştiriyor gibi görünüyor.
Seb Jachec

Gerçekten mi? Benim için değil, yukarıdaki resme bakın. Stili atadığına emin misin app:errorTextAppearance?
dabo248

1
@EugenPechanec Basitleştirilmiş şu şekilde görünür: <android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>. Evet, bu başka bir TextView, bu yüzden TextInputLayout'tan hata rengini almıyor.
dabo248

7
Yalnızca rengini değiştirmek istiyorsanız, bunu stilin çok ayarlamanız en iyisi parentiçin parent="TextAppearance.Design.Error". Bu şekilde, varsayılan metin boyutunu ve diğer tüm özellikleri korur, ancak eldeki sorunun amacı olan hata rengini özel olarak özelleştirmenize izin verelim.
w3bshark

28

Aslında, sadece hata mesajı rengini değiştirmek için, ayarlayabileceğiniz textColorErrorsenin tema (ve ayrıca belirlenen colorControlNormalve colorControlActivatedgenel Widget ipucu metni renk için). TextInputLayoutbu özelliği alır. NOT:errorTextAppearance Özel bir stil ayarlarsanız textColorErrorhiçbir etkisi olmayacaktır.

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

Ve AndroidManifest.xml dosyanızda:

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

    <!-- ... -->

</application>

17
Birisi gerçekten temalar, stiller ve tüm olası özellikler hakkında bir kitap yazmalı. Bu gerçekten çılgınca, renk belirleyebilirsin ve stil pek çok şekilde ve hangisinin doğru yol olduğunu bilmenin bir yolu yok. Ve tabii ki hiçbir belge yok :( Demek istediğim var ama gerçekten kafa karıştırıcı.
aleksamarkoni

bu, yüksek puana göre çok daha iyi bir cevap!
philthomas26

6
Benim için bu çözüm bir hataya neden oldu ( textColorErrorbulunamadı), ancak temamda colorErroröznitelik ayarlamayı başardım . Görünüşe göre Android / Destek Kitaplığı'nın her sürümünün kendi tema öznitelikleri var.
Slav

10
'Android kaynak bağlama işlemi başarısız oldu' <item name="colorError">@color/error</item>
mesajı

4
Lütfen gönderiyi güncelleyin .. textColorError artık colorError oldu.
Matt Wolfe

7

Bir yan not. Kabul edilen çözümü bir ile denedim errorTextAppereance. Gerçekten iyi çalışıyor ama ilk başta, yeni bir errorTextAppereancestil uyguladıktan sonra giriş altı çizgi rengi değişmiyordu . Birkaç yorum olduğunu ve diğer insanların da aynı sorunu yaşadığını görüyorum.

Benim durumumda bu, yeni bir hata metni ayarladıktan sonra yeni bir stil belirlerken oluyordu. Bunun gibi:

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

Bu iki yöntemin sırasını değiştirdikten sonra metin ve altı çizili renk beklendiği gibi değişir.

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

Ve hata metni görünüm stili şuna benzer:

<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
    <item name="android:textColor">@color/purple</item>
</style>

R.style.InputError_Purple'ınız neye benziyor?
toobsco42

@ toobsco42 style yalnızca metin rengini tanımlar. Yanıtı gerçek uygulama ile düzenledim.
Ivan Marić

Teşekkür ederim! Bu görünümü hem geçerli bir metin hem de hata metni (yeşil ve kırmızı) için kullanıyorum ve alt çizgi renginin doğru şekilde değişmemesi beni deli ediyordu.
rexar5

6

Bunu dinamik bir şekilde yapmam gerekiyordu. Yansımayı kullanma:

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

Bunun textInputLayout.setErrorEnabled(true)çalışması için yukarıdaki yöntemi çağırmadan önce aramanız gerekecek .


Hata metninin rengi değişir, ancak alt çizgi rengi kalır Sadece aynı işleve yapılacak bir sonraki çağrıda değişir
Mohammad Shabaz Moosa

@ Dr.aNdRO Bu yansıma kullanır, her zaman çalışması garanti edilmez!
ucMedia

3

İle TextInputLayoutdahil Malzeme Bileşenleri Kütüphanesi sadece kullanmak app:errorTextColorniteliğini.

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

Özel bir stilde şunları kullanabilirsiniz:

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

görüntü açıklamasını buraya girin


1

GÜNCELLEME

Lütfen bunun yerine özel bir görünüm kullanın, bu değil


@ Jared's Answer'ın benim durumumda çalışan değiştirilmiş bir versiyonu:

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

Hata metninin rengi değişir, ancak alt çizgi rengi kalır Sadece aynı işleve yapılacak bir sonraki çağrıda değişir
Mohammad Shabaz Moosa

2
Bunu kullanma. bu şu an için güvenilir değil
Dr. aNdRO

0

Com.google.android.material.textfield.TextInputLayout kullanıyorsanız, bu giriş düzenini yalnızca bir stil belirlemekten çok

<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

İhtiyaca bağlı olarak, TextInputLayout metin rengi dinamik olarak veya doğrudan mizanpaj XML dosyasında değiştirilebilir / ayarlanabilir. Aşağıda örnek kod parçacıkları verilmiştir

Styles.xml dosyanızda üst öğe olarak @android: style / TextAppearance kullanan özel bir stil oluşturun :

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

Ve bunu TextInputLayout widget'ınızda kullanın:

  1. Doğrudan XML Düzeninde
 <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. Sınıfınızda dinamik olarak
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);

Uygulamanız için tek / aynı hata metin rengini ayarlamak isterseniz ardından metin rengini tanımlamak uygulaması tema

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

Ve AndroidManifest.xml dosyanızda:

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

    <!-- ... -->

</application>

-2

TextInputLayout kaynağına baktım ve hata metni renginin colors.xml'den alındığını fark ettim. Bunu colours.xml dosyanıza eklemeniz yeterlidir:

<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>

Eklenen tasarım kitaplığı ile benim için çalışıyor.
Java Geek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.