Làm cách nào để đặt màu thông báo lỗi TextInputLayout?


90

Làm cách nào để thay đổi màu của thông báo lỗi có thể được đặt để xuất hiện bên dưới trường văn bản trong một TextInputLayout(thông qua setError(...)- xem trạng thái lỗi tại đây )?

Nó thường hiển thị dưới dạng màu đỏ, mà tôi muốn thay đổi. Tôi nên sử dụng tên / khóa mục nào trong styles.xmltệp của mình để nhắm mục tiêu màu?

Cảm ơn trước.


Biên tập:

Đã thêm app:errorTextAppearancekhóa vào của tôi 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>

và lỗi xuất hiện (được đặt thành màu xanh lục để kiểm tra) :

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

Kết quả là gợi ý cũng như thông báo lỗi được tô màu (ảnh chụp màn hình từ Trình mô phỏng Android được thu nhỏ) :

Thông thường (không có lỗi):

Trước hình ảnh

Trạng thái lỗi:

Sau hình ảnh

Chỉnh sửa 2 / Kết quả:

Khi thông báo lỗi xuất hiện, gợi ý phía trên trường sẽ chuyển thành màu giống với màu của thông báo lỗi, ghi đè màu gợi ý - đây là do thiết kế.



Màu lỗi thay thế màu gợi ý ở trạng thái lỗi. Đây là do thiết kế. Xem google.com/design/spec/components/… Bạn không thể giải quyết vấn đề này mà không thay đổi lớp TextInputLayout.
Eugen Pechanec

@EugenPechanec Tôi không nhận ra đây là trường hợp. Cám ơn giải thích
Seb Jachec

1
@EugenPechanec Tôi khá chắc chắn rằng bạn đã sai ở đây. Phần bạn đang đề cập là từ bộ đếm ký tự. Đối với các trường bình thường lỗi sẽ giống như trên hình ảnh này (lưu ý rằng gợi ý không màu) material-design.storage.googleapis.com/publish/material_v_4/...
Rzadkowolski Arkadiusz 'ruồi'

2
@EugenPechanec code.google.com/p/android/issues/detail?id=195775 - đó là lỗi thực sự và sẽ được cố định trong phiên bản tương lai :)
Arkadiusz 'ruồi' Rzadkowolski

Câu trả lời:


140

Tạo một kiểu tùy chỉnh sử dụng @android:style/TextAppearancelàm cha mẹ trong styles.xmltệp của bạn :

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

Và sử dụng nó trong tiện ích TextInputLayout của bạ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">

ví dụ lỗi

Chỉnh sửa: Thiết lập các gợi ý về đối tượng, mà là bên trong TextInputLayout của bạn ( EditText, TextView, vv) để giữ màu sắc khác nhau cho các gợi ý và các lỗi.


1
Cảm ơn. Có vẻ đơn giản nhưng không hiểu sao không tìm thấy nó cho cuộc sống của tôi!
Seb Jachec

2
Cập nhật: Có thể chỉ thay đổi kiểu của thông báo lỗi không? Điều này dường như cũng thay đổi kiểu gợi ý phía trên trường.
Seb Jachec,

Có thật không? Đối với tôi thì không, hãy nhìn vào hình trên. Bạn có chắc mình đang chỉ định kiểu cho app:errorTextAppearance?
dabo248

1
@EugenPechanec Giản nó trông như thế này: <android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>. Vâng, đó là một TextView khác, đó là lý do tại sao nó không lấy màu lỗi từ TextInputLayout.
dabo248

7
Nếu bạn chỉ muốn thay đổi màu sắc, tốt nhất là bạn nên đặt kiểu của parentparent="TextAppearance.Design.Error". Bằng cách đó, nó giữ lại kích thước văn bản mặc định và bất kỳ thuộc tính nào khác, nhưng cho phép bạn tùy chỉnh cụ thể màu lỗi, đó là mục tiêu của câu hỏi.
w3bshark

28

Trên thực tế, để chỉ thay đổi màu thông báo lỗi, bạn có thể đặt textColorErrortrong chủ đề của mình (và cũng có thể đặt colorControlNormalcolorControlActivatedcho tiện ích con chung và màu văn bản gợi ý). TextInputLayoutchọn thuộc tính đó. LƯU Ý: nếu bạn đặt thành errorTextAppearancekiểu tùy chỉnh thì textColorErrorsẽ không có hiệu lực.

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

Và trong AndroidManifest.xml của bạn:

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

    <!-- ... -->

</application>

17
Ai đó thực sự nên viết một cuốn sách về chủ đề và phong cách và tất cả các thuộc tính có thể có. Điều này thực sự điên rồ, bạn có thể thiết lập màu sắc và phong cách rất nhiều cách, và không có cách nào để biết cách nào là đúng. Và tắt khóa học không có tài liệu nào cả :( Tôi có nghĩa là có nhưng nó thực sự khó hiểu.
aleksamarkoni

đây là câu trả lời tốt hơn nhiều so với câu trả lời cao hơn!
philthomas 26

6
Đối với tôi, giải pháp này gây ra lỗi ( textColorErrorkhông tìm thấy), nhưng tôi đã quản lý để đặt colorErrorthuộc tính trong chủ đề của mình. Có vẻ như mọi phiên bản của Android / Thư viện hỗ trợ đều có các thuộc tính chủ đề riêng.
Slav

9
Tôi nhận được 'nguồn Android nối thất bại', nhưng với <item name="colorError">@color/error</item>tác phẩm mỹ
m4n3k4s

4
Vui lòng cập nhật bài đăng .. textColorError bây giờ là colorError.
Matt Wolfe

7

Một mặt lưu ý. Tôi đã thử giải pháp được chấp nhận với errorTextAppereance. Nó hoạt động thực sự tốt nhưng lúc đầu, màu gạch dưới đầu vào không thay đổi sau khi áp dụng một errorTextAppereancekiểu mới . Tôi thấy có một số nhận xét và những người khác đang gặp phải vấn đề tương tự.

Trong trường hợp của tôi, điều này đã xảy ra khi tôi thiết lập kiểu mới sau khi đặt văn bản lỗi mới. Như thế này:

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

Sau khi chuyển đổi thứ tự của hai phương pháp này, màu văn bản và gạch chân sẽ thay đổi như mong đợi.

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

Và kiểu xuất hiện văn bản lỗi trông giống như sau:

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

R.style.InputError_Purple của bạn trông như thế nào?
toobsco42

@ toobsco42 style chỉ xác định màu văn bản. Tôi đã chỉnh sửa câu trả lời với việc triển khai thực tế.
Ivan Marić

Cảm ơn bạn! Tôi sử dụng chế độ xem này cho cả văn bản hợp lệ và văn bản lỗi (xanh và đỏ) và màu gạch chân không thay đổi chính xác đã khiến tôi phát điên.
rexar5

6

Tôi cần phải làm điều này một cách năng động. Sử dụng phản xạ:

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

Bạn sẽ cần gọi textInputLayout.setErrorEnabled(true)trước khi gọi phương thức trên để phương thức này hoạt động.


Những thay đổi màu chữ lỗi nhưng màu gạch dưới vẫn ở lại Nó thay đổi duy nhất trên cuộc gọi bên cạnh các chức năng tương tự
Mohammad Shabaz Moosa

@ Dr.aNdRO Điều này sử dụng phản chiếu, nó không được đảm bảo luôn hoạt động!
ucMedia

3

Với phần được TextInputLayoutbao gồm trong Thư viện Thành phần Vật liệu, chỉ cần sử dụng app:errorTextColorthuộc tính.

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

Trong một phong cách tùy chỉnh, bạn có thể sử dụng:

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

nhập mô tả hình ảnh ở đây


1

CẬP NHẬT

Vui lòng sử dụng chế độ xem tùy chỉnh thay thế chứ không phải chế độ này


Phiên bản mod của @ jared's Answer hoạt động trong trường hợp của tôi:

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

Những thay đổi màu chữ lỗi nhưng màu gạch dưới vẫn ở lại Nó thay đổi duy nhất trên cuộc gọi bên cạnh các chức năng tương tự
Mohammad Shabaz Moosa

2
Không sử dụng cái này. đây là không đáng tin cậy như của bây giờ
Tiến sĩ Andro

0

Nếu bạn đang sử dụng com.google.android.material.textfield.TextInputLayout bố cục đầu vào này hơn là bạn chỉ đặt một kiểu

<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

Tùy theo nhu cầu, người ta có thể thay đổi / đặt màu văn bản TextInputLayout động hoặc trực tiếp trong tệp XML bố cục. Dưới đây là các đoạn mã mẫu

Tạo kiểu tùy chỉnh sử dụng @android: style / TextAppearance làm cha trong tệp styles.xml của bạn :

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

Và, sử dụng nó trong tiện ích TextInputLayout của bạn:

  1. Trực tiếp trong Bố cục XML
 <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. Năng động trong lớp học của bạn
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);

Nếu bạn muốn đặt màu văn bản lỗi duy nhất / giống nhau cho ứng dụng của mình thì hãy xác định màu văn bản trong chủ đề ứng dụng của bạn

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

Và trong AndroidManifest.xml của bạn:

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

    <!-- ... -->

</application>

-2

Tôi đã xem xét nguồn TextInputLayout và tôi nhận ra rằng màu văn bản lỗi được lấy từ Colors.xml. Chỉ cần thêm điều này vào màu sắc của bạn. Xml:

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

Làm việc cho tôi với thư viện thiết kế được thêm vào.
Java Geek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.