ออกแบบ Android EditText เพื่อแสดงข้อความแสดงข้อผิดพลาดตามที่อธิบายโดย google


151

ฉันต้องการสิ่งEditTextที่ดูเหมือนว่าข้อผิดพลาดนี้:

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

การเรียกใช้ onError มีลักษณะเช่นนี้แทน:

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

หมายเหตุ: แอปทำงานบน SDK 19 (4.4.2)

min SDK คือ 1

มีวิธีการคล้ายกับ setError ที่ทำสิ่งนี้โดยอัตโนมัติหรือฉันต้องเขียนโค้ดให้หรือไม่

ขอบคุณ


1
EditTextคุณไม่น่าจะมีความสามารถในการทำที่มีเพียง มีโอกาสมากขึ้นที่คุณจะต้องการสิ่งที่ล้อมรอบEditTextหรือเพิ่มเข้าไป ดูgithub.com/rengwuxian/MaterialEditText
CommonsWare

คำตอบ:


330

ไม่มีความจำเป็นต้องใช้ห้องสมุดของบุคคลที่สามเนื่องจาก Google เปิดตัวเป็นเป็นส่วนหนึ่งของ TextInputLayoutdesign-support-library

ทำตามตัวอย่างพื้นฐาน:

แบบ

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

    <android.support.design.widget.TextInputEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

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

หมายเหตุ:โดยการตั้งค่าapp:errorEnabled="true"เป็นคุณลักษณะของTextInputLayoutมันจะไม่เปลี่ยนขนาดของมันเมื่อมีข้อผิดพลาดจะปรากฏขึ้น - ดังนั้นจึงเป็นพื้นบล็อกพื้นที่

รหัส

เพื่อแสดงให้เห็นข้อผิดพลาดด้านล่างEditTextคุณก็ต้องโทร#setErrorในTextInputLayout(ไม่เกี่ยวกับเด็กEditText):

TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");

ผลลัพธ์

รูปภาพแสดงข้อความแก้ไขพร้อมข้อความแสดงข้อผิดพลาด

til.setError(null)หากต้องการซ่อนข้อผิดพลาดและการตั้งค่าสีก็เรียก


บันทึก

ในการใช้งานTextInputLayoutคุณจะต้องเพิ่มสิ่งต่อไปนี้ในการbuild.gradleพึ่งพาของคุณ:

dependencies {
    compile 'com.android.support:design:25.1.0'
}

การตั้งค่าสีที่กำหนดเอง

โดยค่าเริ่มต้นบรรทัดของEditTextจะเป็นสีแดง setErrorหากคุณจำเป็นต้องแสดงสีที่แตกต่างกันคุณสามารถใช้รหัสต่อไปโดยเร็วที่สุดเท่าที่คุณเรียก

editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);

เพื่อล้างมันก็เรียกclearColorFilterฟังก์ชั่นเช่นนี้

editText.getBackground().clearColorFilter();

3
ใช่! แค่นั้นแหละ ! คุณจะทำให้สายเป็นสีแดงได้อย่างไร
kmn

3
@kmn การทำให้เส้นสีแดงไม่ได้ออกมาจากกล่องดังนั้นคุณต้องทำด้วยตัวเอง ดูการแก้ไขของฉัน ในแง่ของการย้ายคำแนะนำ: นั่นเป็นไปไม่ได้เลย
ย้อนกลับ

5
@Alessio ฉันแค่พยายามจะบอกว่ามันจะทำงานได้ดีเมื่อคุณขยาย AppCompatActivity อย่างไรก็ตาม: ใน appcompat-v23 ไม่จำเป็นต้องตั้งค่าตัวกรองสีอีกต่อไปทันทีที่คุณเรียกtextInputLayout.setError("Error messsage")ใช้สีของตัวกรองEditTextควรเปลี่ยนเป็นสีแดง textInputLayout.setError(null)เพื่อที่จะตั้งค่ามันก็มากพอที่จะเรียกร้อง
ย้อนกลับ

3
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);ไม่ต้องการอีกต่อไปกับห้องสมุดสนับสนุนล่าสุด
แอนทอนโบวี่วี่

13
แค่อยากจะทราบเพราะมันเป็นเช่นรายละเอียดเล็ก ๆ - ผมมีปัญหานี้โดยการเรียก SetError บนไม่ได้EditText TextInputLayoutฉันเห็นคำตอบนี้และยังไม่สามารถระบุสิ่งที่ฉันต้องการเปลี่ยนแปลงได้ สิ่งที่พลาดง่ายมาก
h_k

8

โทรแทนmyTextInputLayout.setError()myEditText.setError()

คอนเทนเนอร์และการบรรจุเหล่านี้มีฟังก์ชันการทำงานสองอย่างในการตั้งข้อผิดพลาด ฟังก์ชั่นที่คุณต้องการคือหนึ่งในคอนเทนเนอร์ แต่คุณอาจต้องการเวอร์ชัน 23 ขั้นต่ำสำหรับสิ่งนั้น


7

คุณEditTextควรห่อด้วยTextInputLayout

<android.support.design.widget.TextInputLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tilEmail">

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        android:ems="10"
        android:id="@+id/etEmail"
        android:hint="Email"
        android:layout_marginTop="10dp"
        />

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

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

TextInputLayout tilEmail = (TextInputLayout) findViewById(R.id.tilEmail);
if (error){
    tilEmail.setError("Invalid email id");    
}

คุณควรเพิ่มการพึ่งพาไลบรารีสนับสนุนการออกแบบ เพิ่มบรรทัดนี้ในการไล่ระดับสีของคุณ

compile 'com.android.support:design:22.2.0'

4

คำตอบของ reVerse นั้นยอดเยี่ยม แต่ก็ไม่ได้ชี้ให้เห็นว่าจะลบข้อผิดพลาดแบบลอยได้อย่างไร

คุณจะต้องedittext.setError(null)ลบมัน
นอกจากนี้ในขณะที่บางคนชี้ให้เห็นคุณไม่ต้องการTextInputLayout.setErrorEnabled(true)

แบบ

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

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter something" />
</android.support.design.widget.TextInputLayout>

รหัส

TextInputLayout til = (TextInputLayout) editText.getParent();
til.setError("Your input is not valid...");
editText.setError(null);


0

หากใครยังคงพบข้อผิดพลาดกับการใช้ห้องสมุดออกแบบของ Google ตามที่ระบุไว้ในคำตอบแล้วโปรดใช้สิ่งนี้ตามความเห็นโดย @h_k ซึ่งเป็น -

แทนที่จะเรียกใช้setError บน TextInputLayoutคุณอาจใช้setError บน EditTextเอง


0
private EditText edt_firstName;
private String firstName;

edt_firstName = findViewById(R.id.edt_firstName);

private void validateData() {
 firstName = edt_firstName.getText().toString().trim();
 if (!firstName.isEmpty(){
//here api call for ....
}else{
if (firstName.isEmpty()) {
                edt_firstName.setError("Please Enter First Name");
                edt_firstName.requestFocus();
            } 
}
}

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