Google tarafından açıklandığı gibi hata mesajını göstermek için Android EditText tasarlayın


151

EditTextHataya benzeyen bir şeye ihtiyacım var :

resim açıklamasını buraya girin

onError çağrısı bunun yerine şöyle görünür:

resim açıklamasını buraya girin

Not: uygulama SDK 19 (4.4.2) üzerinde çalışıyor

min SDK 1

SetError benzeri bir yöntemi otomatik olarak yapan bir yöntem var mı, ya da bunun için kod yazmak zorunda mıyım?

teşekkür ederim


1
Bunu sadece bir ile yapamazsınız EditText. Büyük olasılıkla, onu saran EditTextveya başka bir şekilde ekleyen bir şeye ihtiyacınız olacaktır . Bkz. Github.com/rengwuxian/MaterialEditText .
CommonsWare

Yanıtlar:


330

Google'ın bir TextInputLayoutparçası olarak tanıtımını yaptığı için üçüncü taraf bir kitaplık kullanmaya gerek yoktur design-support-library.

Temel bir örneği takiben:

Yerleşim

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

Not:app:errorEnabled="true" Bir öznitelik olarak ayarlandığında , bir TextInputLayouthata görüntülendiğinde boyutunu değiştirmez - bu nedenle temel olarak alanı engeller.

kod

Aşağıdaki Hata göstermek için EditTextsadece çağrıya ihtiyaç #setErrorüzerine TextInputLayout(NOT çocuğun üzerine EditText):

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

Sonuç

hata mesajıyla düzenleme metnini gösteren resim

Hatayı gizlemek ve renk tonunu sıfırlamak için arayın til.setError(null).


Not

Kullanmak TextInputLayoutiçin build.gradlebağımlılıklarınıza aşağıdakileri eklemeniz gerekir :

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

Özel bir renk ayarlama

Varsayılan olarak, EditTextirade çizgisi kırmızı olacaktır. Farklı bir renk görüntülemeniz gerekiyorsa, aradığınız anda aşağıdaki kodu kullanabilirsiniz setError.

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

Temizlemek için clearColorFilterişlevi şöyle çağırmanız yeterlidir :

editText.getBackground().clearColorFilter();

3
Evet ! Bu kadar ! Çizgiyi nasıl kırmızı yaparsın?
kmn

3
@kmn Çizgiyi kırmızı yapmak kutunun dışına çıkmaz, bu yüzden kendi başınıza yapmanız gerekir. Düzenlememe bakın. İpucu taşımak açısından: Bu afaik mümkün değil.
Ters

5
@Alessio Sadece AppCompatActivity'yi genişlettiğinizde çalışması gerektiğini söylemeye çalışıyordum. Bununla birlikte: appcompat-v23'ten itibaren, colorFilter öğesini ayarlamak zorunda değilsiniz, aradığınız textInputLayout.setError("Error messsage")anda rengi EditTextkırmızıya dönmelidir. Sıfırlamak için aramak yeterlidir textInputLayout.setError(null).
Ters

3
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);artık en son destek kütüphanesi ile ihtiyaç
duyulmuyor

13
Sadece küçük bir detay olduğu için not etmek istedim - bu problemi setError'ı EditTextdeğil, çağırarak yaşıyordum TextInputLayout. Bu cevabı gördüm ve hala neyi değiştirmem gerektiğini anlayamadım. Kaçırmak çok kolay bir şey.
h_k

8

myTextInputLayout.setError()Bunun yerine arayın myEditText.setError().

Bu kap ve muhafaza, hataların ayarlanmasında çift işlevselliğe sahiptir. İhtiyacınız olan işlevsellik kabın bir işlevidir. Ancak bunun için minimum 23 sürümüne ihtiyacınız olabilir.


7

Sizin EditTexta sarılmış olmalıdırTextInputLayout

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

İstediğiniz gibi bir hata mesajı almak için hatayı TextInputLayout

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

Tasarım desteği kitaplığı bağımlılığı eklemelisiniz. Bu satırı sınıflandırma bağımlılıklarınıza ekleyin

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

4

reVerse'ın cevabı harika ama kayan hata araç ipucunun nasıl kaldırılacağına işaret etmedi

Bunu edittext.setError(null)kaldırman gerekecek .
Ayrıca, birinin işaret ettiği gibi, ihtiyacınız yokTextInputLayout.setErrorEnabled(true)

Yerleşim

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

kod

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
setErrorEnabled gerekli değil
JacksOnF1re

0

Yanıtta belirtildiği gibi google'ın tasarım kitaplığını kullanma konusunda hala hatayla karşılaşan varsa, lütfen bunu @h_k tarafından yorumlandığı gibi kullanın -

TextInputLayout'ta setError öğesini çağırmak yerine EditText'in kendisinde setError kullanıyor olabilirsiniz .


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

Eski bir soruyu cevaplarken, özellikle de zaten kabul edilmiş bir cevabı olan bir soru için cevabınızın nasıl yardımcı olduğunu açıklamak için bir bağlam eklediyseniz, cevabınız diğer StackOverflow kullanıcıları için çok daha yararlı olacaktır. Bakınız: İyi bir cevabı nasıl yazarım .
David Buck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.