วิธีการตั้งค่าสีข้อความแสดงข้อผิดพลาด TextInputLayout


93

ฉันจะเปลี่ยนสีของข้อความแสดงข้อผิดพลาดที่สามารถตั้งค่าให้ปรากฏใต้ช่องข้อความในTextInputLayout(ผ่านsetError(...)- ดูสถานะข้อผิดพลาดที่นี่ ) ได้อย่างไร

โดยปกติจะแสดงเป็นสีแดงซึ่งฉันต้องการเปลี่ยน ฉันควรใช้ชื่อ / คีย์รายการใดในstyles.xmlไฟล์เพื่อกำหนดเป้าหมายสี

ขอบคุณล่วงหน้า.


แก้ไข:

เพิ่มapp:errorTextAppearanceคีย์ของฉัน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>

และลักษณะข้อผิดพลาด(ตั้งค่าเป็นสีเขียวสำหรับการทดสอบ) :

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

ผลที่ได้คือคำใบ้และข้อความแสดงข้อผิดพลาดเป็นสี(ภาพหน้าจอจาก Android Emulator ที่ปรับขนาด) :

ปกติ (ไม่มีข้อผิดพลาด):

ก่อนภาพ

สถานะข้อผิดพลาด:

ภาพติดตา

แก้ไข 2 / ผลลัพธ์:

เมื่อข้อความแสดงข้อผิดพลาดปรากฏขึ้นคำใบ้ด้านบนฟิลด์จะเปลี่ยนเป็นสีเดียวกับข้อความแสดงข้อผิดพลาดโดยจะลบล้างสีคำใบ้ซึ่งเกิดจากการออกแบบ


เป็นไปได้ที่จะซ้ำกันของHow to write style to error text ของ EditText ใน Android
สุ่ม

สีข้อผิดพลาดจะแทนที่สีคำใบ้ในสถานะข้อผิดพลาด นี่คือการออกแบบ ดูgoogle.com/design/spec/components/…คุณไม่สามารถแก้ไขปัญหานี้ได้โดยไม่ต้องแก้ไขคลาส TextInputLayout
Eugen Pechanec

@EugenPechanec ฉันไม่ทราบว่าเป็นกรณีนี้ ขอบคุณสำหรับคำอธิบาย
Seb Jachec

1
@EugenPechanec ฉันค่อนข้างแน่ใจว่าคุณคิดผิดที่นี่ ส่วนที่คุณอ้างถึงมาจากตัวนับอักขระ สำหรับข้อผิดพลาดช่องปกติควรมีลักษณะเช่นนี้ในภาพนี้ (สังเกตว่าคำใบ้จะไม่มีสี) material-design.storage.googleapis.com/publish/material_v_4/…
Arkadiusz 'fly' Rzadkowolski

2
@EugenPechanec code.google.com/p/android/issues/detail?id=195775 - มันเป็นข้อผิดพลาดแน่นอนและจะได้รับการแก้ไขในอนาคต :)
Arkadiusz 'แมลงวัน' Rzadkowolski

คำตอบ:


143

สร้างสไตล์ที่กำหนดเองซึ่งใช้@android:style/TextAppearanceเป็นหลักใน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>

และใช้ในวิดเจ็ต TextInputLayout ของคุณ:

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

ตัวอย่างข้อผิดพลาด

แก้ไข:ตั้งค่าคำแนะนำบนวัตถุที่อยู่ภายใน TextInputLayout คุณ ( EditText, TextViewฯลฯ ) จะถือสีที่แตกต่างกันสำหรับคำแนะนำและข้อผิดพลาด


1
ขอบคุณ. ดูเหมือนจะตรงไปตรงมา แต่หาไม่ได้เลยสำหรับชีวิตของฉัน!
Seb Jachec

2
อัปเดต: เป็นไปได้ไหมที่จะเปลี่ยนรูปแบบของข้อความแสดงข้อผิดพลาด ดูเหมือนว่าจะเปลี่ยนรูปแบบคำใบ้ด้านบนฟิลด์ด้วย
Seb Jachec

จริงๆ? ไม่ใช่สำหรับฉันดูที่ภาพด้านบน คุณแน่ใจว่าคุณกำลังกำหนดรูปแบบเพื่อapp:errorTextAppearance?
dabo248

1
@EugenPechanec ทำให้ง่ายขึ้นดูเหมือนว่า: <android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>. ใช่มันเป็น TextView อื่นนั่นเป็นเหตุผลว่าทำไมจึงไม่ใช้สีข้อผิดพลาดจาก TextInputLayout
dabo248

7
หากคุณต้องการเปลี่ยนเฉพาะสีก็จะดีที่สุดที่คุณตั้งค่ารูปแบบเป็นไปparent parent="TextAppearance.Design.Error"ด้วยวิธีนี้จะยังคงรักษาขนาดข้อความเริ่มต้นและแอตทริบิวต์อื่น ๆ ไว้ แต่ให้คุณกำหนดสีข้อผิดพลาดโดยเฉพาะซึ่งเป็นเป้าหมายของคำถาม
w3bshark

28

อันที่จริงหากต้องการเปลี่ยนสีข้อความแสดงข้อผิดพลาดคุณสามารถตั้งค่าtextColorErrorในธีมของคุณได้ (และยังตั้งค่าcolorControlNormalและcolorControlActivatedสำหรับวิดเจ็ตทั่วไปและสีข้อความคำใบ้) TextInputLayoutหยิบแอตทริบิวต์นั้น หมายเหตุ:หากคุณตั้งค่าerrorTextAppearanceเป็นสไตล์แบบกำหนดเองtextColorErrorจะไม่มีผลใด ๆ

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

และใน AndroidManifest.xml ของคุณ:

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

    <!-- ... -->

</application>

17
ใครบางคนควรเขียนหนังสือเกี่ยวกับธีมและสไตล์และคุณลักษณะที่เป็นไปได้ทั้งหมด นี่เป็นเรื่องบ้ามากคุณสามารถกำหนดสีและรูปแบบได้หลายวิธีและไม่มีทางรู้ได้ว่าวิธีใดเหมาะสมที่จะไป และนอกหลักสูตรไม่มีเอกสารใด ๆ เลย :( ฉันหมายความว่ามี แต่มันสับสนจริงๆ
aleksamarkoni

นี่เป็นคำตอบที่ดีกว่าคะแนนที่สูงกว่ามาก!
philthomas26

6
สำหรับฉันวิธีนี้ทำให้เกิดข้อผิดพลาด ( textColorErrorไม่พบ) แต่ฉันจัดการเพื่อตั้งค่าcolorErrorแอตทริบิวต์ในธีมของฉัน ดูเหมือนว่า Android / Support Library ทุกเวอร์ชันจะมีคุณลักษณะของธีมของตัวเอง
Slav

10
ฉันได้รับ 'การเชื่อมโยงทรัพยากร Android ล้มเหลว' แต่ใช้<item name="colorError">@color/error</item>งานได้ดี
m4n3k4s

4
โปรดอัปเดตโพสต์ .. textColorError ตอนนี้ colorError
Matt Wolfe

7

หมายเหตุด้านเดียว ฉันได้ลองใช้วิธีแก้ปัญหาที่ได้รับการยอมรับerrorTextAppereanceแล้ว ใช้งานได้ดีจริงๆ แต่ในตอนแรกสีขีดเส้นใต้ของอินพุตไม่เปลี่ยนหลังจากใช้errorTextAppereanceรูปแบบใหม่ ฉันเห็นว่ามีความคิดเห็นบางส่วนและมีคนอื่น ๆ กำลังประสบปัญหาเดียวกัน

ในกรณีของฉันเหตุการณ์นี้เกิดขึ้นเมื่อฉันตั้งค่ารูปแบบใหม่หลังจากตั้งค่าข้อความแสดงข้อผิดพลาดใหม่ แบบนี้:

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

หลังจากเปลี่ยนลำดับของสองวิธีนี้ข้อความและสีขีดเส้นใต้จะเปลี่ยนไปตามที่คาดไว้

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

และลักษณะข้อความแสดงข้อผิดพลาดมีลักษณะดังนี้:

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

R. style.InputError_Purple ของคุณมีลักษณะอย่างไร?
toobsco42

สไตล์ @ toobsco42 กำหนดสีข้อความเท่านั้น ฉันได้แก้ไขคำตอบด้วยการใช้งานจริง
Ivan Marić

ขอขอบคุณ! ฉันใช้มุมมองนี้สำหรับทั้งข้อความที่ถูกต้องและข้อความแสดงข้อผิดพลาด (สีเขียวและสีแดง) และสีขีดเส้นใต้ที่เปลี่ยนไม่ถูกต้องทำให้ฉันแทบคลั่ง
rexar5

6

ฉันต้องการทำสิ่งนี้แบบไดนามิก ใช้การสะท้อน:

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

คุณจะต้องโทรtextInputLayout.setErrorEnabled(true)ก่อนเรียกใช้วิธีการข้างต้นเพื่อให้ได้ผล


สีข้อความแสดงข้อผิดพลาดเปลี่ยนไป แต่สีขีดเส้นใต้ยังคงอยู่มันจะเปลี่ยนเฉพาะในการเรียกใช้ฟังก์ชันเดียวกันครั้งถัดไป
Mohammad Shabaz Moosa

@ Dr.aNdRO สิ่งนี้ใช้การสะท้อนไม่รับประกันว่าจะใช้ได้เสมอไป!
ucMedia

3

เมื่อTextInputLayoutรวมอยู่ในไลบรารีส่วนประกอบวัสดุให้ใช้app:errorTextColorแอตทริบิวต์

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

ในรูปแบบที่กำหนดเองคุณสามารถใช้:

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

ป้อนคำอธิบายภาพที่นี่


1

อัปเดต

โปรดใช้มุมมองที่กำหนดเองแทนไม่ใช่สิ่งนี้


คำตอบของ @ jared รุ่นดัดแปลงซึ่งใช้ได้กับกรณีของฉัน:

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

สีข้อความแสดงข้อผิดพลาดเปลี่ยนไป แต่สีขีดเส้นใต้ยังคงอยู่มันจะเปลี่ยนเฉพาะในการเรียกใช้ฟังก์ชันเดียวกันครั้งถัดไป
Mohammad Shabaz Moosa

2
อย่าใช้สิ่งนี้ สิ่งนี้ไม่น่าเชื่อถือ ณ ตอนนี้
ดร. aNdRO

0

หากคุณกำลังใช้com.google.android.material.textfield.TextInputวางเค้าโครงอินพุตนี้มากกว่าที่คุณจะกำหนดสไตล์เดียว

<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

ขึ้นอยู่กับความต้องการคุณสามารถเปลี่ยน / ตั้งค่าสีข้อความ TextInputLayout แบบไดนามิกหรือโดยตรงในไฟล์ XML เค้าโครง ด้านล่างนี้คือตัวอย่างข้อมูลโค้ด

สร้างสไตล์แบบกำหนดเองซึ่งใช้@android: style / TextAppearanceเป็นหลักในไฟล์styles.xmlของคุณ:

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

และใช้ในวิดเจ็ต TextInputLayout ของคุณ:

  1. โดยตรงในเค้าโครง 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. แบบไดนามิกในชั้นเรียนของคุณ
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);

หากคุณต้องการตั้งค่าสีข้อความแสดงข้อผิดพลาดเดียว / เดียวกันสำหรับแอปพลิเคชันของคุณให้กำหนดสีข้อความในธีมแอปของคุณ

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

และใน AndroidManifest.xml ของคุณ:

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

    <!-- ... -->

</application>

-2

ฉันตรวจสอบแหล่งที่มา TextInputLayout และฉันรู้ว่าสีข้อความแสดงข้อผิดพลาดได้มาจาก colors.xml เพียงเพิ่มสิ่งนี้ลงใน colors.xml ของคุณ:

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

ใช้งานได้กับฉันด้วยการเพิ่มไลบรารีการออกแบบ
Java Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.