Thiết kế Android EditText để hiển thị thông báo lỗi như được mô tả bởi google


151

Tôi cần một EditTextcái giống như thế này trênError:

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

thay vào đó, gọi onError trông như thế này:

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

Lưu ý: ứng dụng đang chạy trên SDK 19 (4.4.2)

SDK tối thiểu là 1

Có một phương thức tương tự như setError thực hiện điều này một cách tự động hay tôi phải viết mã cho nó?

Cảm ơn bạn


1
Bạn không thể làm điều đó chỉ với một EditText. Nhiều khả năng, bạn sẽ cần một cái gì đó kết thúc tốt đẹp EditTexthoặc thêm vào nó. Xem github.com/rengwuxian/M vật liệu Chỉnh sửa .
CommonsWare

Câu trả lời:


330

Không cần sử dụng thư viện của bên thứ ba kể từ khi Google giới thiệu TextInputLayoutlà một phần của design-support-library.

Sau một ví dụ cơ bản:

Bố trí

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

Lưu ý: Bằng cách đặt app:errorEnabled="true"làm thuộc tính của TextInputLayoutnó, nó sẽ không thay đổi kích thước của nó một khi lỗi được hiển thị - vì vậy về cơ bản nó sẽ chặn không gian.

Để hiển thị các lỗi dưới EditTextbạn chỉ cần gọi #setErrorvào TextInputLayout(KHÔNG trên con EditText):

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

Kết quả

hình ảnh hiển thị văn bản chỉnh sửa với thông báo lỗi

Để ẩn lỗi và thiết lập lại màu, chỉ cần gọi til.setError(null).


Ghi chú

Để sử dụng, TextInputLayoutbạn phải thêm các mục sau vào phần build.gradlephụ thuộc của mình :

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

Đặt màu tùy chỉnh

Theo mặc định, dòng của EditTextsẽ có màu đỏ. Nếu bạn cần hiển thị một màu khác, bạn có thể sử dụng mã sau đây ngay khi bạn gọi setError.

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

Để xóa nó, chỉ cần gọi clearColorFilterhàm, như thế này:

editText.getBackground().clearColorFilter();

3
Đúng ! Đó là nó ! Làm thế nào để bạn làm cho dòng màu đỏ mặc dù?
kmn

3
@kmn Làm cho đường màu đỏ không đi ra khỏi hộp vì vậy bạn cần phải tự làm. Xem chỉnh sửa của tôi. Về mặt di chuyển Gợi ý: Điều đó không thể xảy ra.
xác minh lại

5
@Alessio Tôi chỉ cố gắng nói rằng nó sẽ hoạt động khi bạn mở rộng AppCompatActivity. Tuy nhiên: Kể từ appcompat-v23, không cần thiết phải đặt bộ lọc màu nữa, ngay khi bạn gọi textInputLayout.setError("Error messsage")màu của màu EditTextsẽ chuyển sang màu đỏ. Để thiết lập lại, nó là đủ để gọi textInputLayout.setError(null).
xác minh lại

3
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);không còn cần thiết nữa với thư viện hỗ trợ mới nhất
Antoine Bolvy

13
Chỉ muốn lưu ý, vì đó là một chi tiết nhỏ như vậy - tôi đã gặp vấn đề này bằng cách gọi setError trên EditTextchứ không phải TextInputLayout. Tôi đã thấy câu trả lời này và vẫn không thể tìm ra những gì tôi cần thay đổi. Điều rất dễ bỏ lỡ.
h_k

8

Gọi myTextInputLayout.setError()thay myEditText.setError().

Các thùng chứa và ngăn chặn có chức năng kép về cài đặt lỗi. Chức năng bạn cần là một trong đó. Nhưng bạn có thể yêu cầu phiên bản tối thiểu 23 cho điều đó.


7

Bạn EditTextnên được bọc trong mộtTextInputLayout

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

Để nhận thông báo lỗi như bạn muốn, hãy đặt lỗi thành TextInputLayout

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

Bạn nên thêm phụ thuộc thư viện hỗ trợ thiết kế. Thêm dòng này trong phụ thuộc lớp của bạn

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

4

Câu trả lời của reVerse là tuyệt vời nhưng nó đã không chỉ ra làm thế nào để loại bỏ loại công cụ lỗi nổi

Bạn sẽ cần edittext.setError(null)phải loại bỏ điều đó.
Ngoài ra, như ai đó đã chỉ ra, bạn không cầnTextInputLayout.setErrorEnabled(true)

Bố trí

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

1
TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");

7
setErrorEnables không cần thiết
JacksOnF1re

0

Nếu bất cứ ai vẫn gặp phải lỗi khi sử dụng thư viện thiết kế của google như được đề cập trong câu trả lời thì hãy sử dụng thông tin này như nhận xét của @h_k -

Thay vì gọi setError trên TextInputLayout , Bạn có thể đang sử dụng setError trên 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();
            } 
}
}

Khi trả lời một câu hỏi cũ, câu trả lời của bạn sẽ hữu ích hơn nhiều cho những người dùng StackOverflow khác nếu bạn đưa vào một số ngữ cảnh để giải thích cách trả lời của bạn, đặc biệt đối với một câu hỏi đã có câu trả lời được chấp nhận. Xem: Làm thế nào để tôi viết một câu trả lời tốt .
David Buck
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.