Desain Android EditText untuk menampilkan pesan kesalahan seperti yang dijelaskan oleh google

151

Saya perlu EditTextyang terlihat seperti ini diError:

masukkan deskripsi gambar di sini

memanggil onError yang terlihat seperti ini sebagai gantinya:

masukkan deskripsi gambar di sini

Catatan: aplikasi ini berjalan pada SDK 19 (4.4.2)

min SDK adalah 1

Apakah ada metode yang mirip dengan setError yang melakukan ini secara otomatis, atau apakah saya harus menulis kode untuk itu?

Terima kasih

kmn
sumber
1
Anda tidak mungkin dapat melakukannya hanya dengan EditText. Kemungkinan besar, Anda akan membutuhkan sesuatu yang membungkus EditTextatau menambahnya. Lihat github.com/rengwuxian/MaterialEditText .
CommonsWare

Jawaban:

330

Tidak perlu menggunakan perpustakaan pihak ketiga karena Google memperkenalkan TextInputLayoutsebagai bagian dari design-support-library.

Berikut contoh dasar:

Tata letak

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

Catatan: Dengan menetapkan app:errorEnabled="true"sebagai atribut, atribut TextInputLayoutitu tidak akan mengubah ukurannya setelah kesalahan ditampilkan - jadi pada dasarnya memblokir ruang.

Kode

Dalam rangka untuk menunjukkan kesalahan di bawah EditTextAnda hanya perlu panggilan #setErrorpada TextInputLayout(TIDAK pada anak EditText):

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

Hasil

gambar yang menunjukkan teks edit dengan pesan kesalahan

Untuk menyembunyikan kesalahan dan mengatur ulang warna cukup panggil til.setError(null).


Catatan

Untuk menggunakan, TextInputLayoutAnda harus menambahkan yang berikut ke build.gradledependensi Anda :

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

Pengaturan warna khusus

Secara default garis EditTextakan berwarna merah. Jika Anda perlu menampilkan warna berbeda, Anda dapat menggunakan kode berikut segera setelah Anda menelepon setError.

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

Untuk menghapusnya cukup panggil clearColorFilterfungsi, seperti ini:

editText.getBackground().clearColorFilter();
balik
sumber
3
Iya ! Itu dia ! Bagaimana Anda membuat garis merah?
kmn
3
@kmn Membuat garis merah tidak keluar dari kotak sehingga Anda perlu melakukannya sendiri. Lihat hasil edit saya. Dalam hal memindahkan Petunjuk: Itu afaik tidak mungkin.
Kembalikan
5
@Alessio Saya baru saja mencoba mengatakan bahwa itu seharusnya bekerja ketika Anda memperluas AppCompatActivity. Namun demikian: Pada appcompat-v23 tidak perlu mengatur colorFilter lagi, segera setelah Anda memanggil textInputLayout.setError("Error messsage")warna yang EditTextseharusnya menjadi merah. Untuk meresetnya, cukup menelepon textInputLayout.setError(null).
Kembalikan
3
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);tidak diperlukan lagi dengan perpustakaan dukungan terbaru
Antoine Bolvy
13
Hanya ingin mencatat, karena ini detail kecil - Saya mengalami masalah ini dengan memanggil setError pada EditText, bukan TextInputLayout. Saya melihat jawaban ini dan masih tidak tahu apa yang perlu saya ubah. Sangat mudah untuk dilewatkan.
h_k
8

Panggil myTextInputLayout.setError()alih-alih myEditText.setError().

Wadah dan kontainmen ini memiliki fungsi ganda pada kesalahan pengaturan. Fungsionalitas yang Anda butuhkan adalah salah satu wadah itu. Tapi Anda bisa memerlukan versi minimal 23 untuk itu.

Zon
sumber
7

Anda EditTextharus dibungkus dengan: aTextInputLayout

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

Untuk mendapatkan pesan kesalahan seperti yang Anda inginkan, atur kesalahan ke TextInputLayout

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

Anda harus menambahkan ketergantungan pustaka dukungan desain. Tambahkan baris ini di dependensi gradle Anda

compile 'com.android.support:design:22.2.0'
aqel
sumber
4

Jawaban reVerse bagus, tetapi tidak menunjukkan bagaimana cara menghapus tooltip kesalahan mengambang semacam itu

Anda harus edittext.setError(null)menghapusnya.
Juga, seperti yang ditunjukkan seseorang, Anda tidak perluTextInputLayout.setErrorEnabled(true)

Tata letak

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

Kode

TextInputLayout til = (TextInputLayout) editText.getParent();
til.setError("Your input is not valid...");
editText.setError(null);
ericn
sumber
1
TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");
Max Bazaleev
sumber
7
setErrorEnabled tidak diperlukan
JacksOnF1re
0

Jika ada yang masih menghadapi kesalahan dengan menggunakan pustaka desain google seperti yang disebutkan dalam jawaban, silakan gunakan ini seperti yang dikomentari oleh @h_k yaitu -

Alih-alih memanggil setError pada TextInputLayout , Anda mungkin menggunakan setError pada EditText itu sendiri.

B.shruti
sumber
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();
            } 
}
}
MEGHA DOBARIYA
sumber
Saat menjawab pertanyaan lama, jawaban Anda akan jauh lebih bermanfaat bagi pengguna StackOverflow lain jika Anda menyertakan beberapa konteks untuk menjelaskan bagaimana jawaban Anda membantu, terutama untuk pertanyaan yang sudah memiliki jawaban yang diterima. Lihat: Bagaimana saya menulis jawaban yang bagus .
David Buck