Progetta Android EditText per mostrare il messaggio di errore come descritto da Google


151

Ho bisogno di un EditTextsimile a questo su Errore:

inserisci qui la descrizione dell'immagine

chiamando onError invece assomiglia a questo:

inserisci qui la descrizione dell'immagine

Nota: l'app è in esecuzione su SDK 19 (4.4.2)

SDK minimo è 1

Esiste un metodo simile a setError che lo fa automaticamente o devo scrivere il codice per farlo?

Grazie


1
È improbabile che tu possa farlo con un solo EditText. Più probabilmente, avrai bisogno di qualcosa che lo avvolga EditTexto lo aggiunga altrimenti. Vedi github.com/rengwuxian/MaterialEditText .
CommonsWare,

Risposte:


330

Non è necessario utilizzare una libreria di terze parti poiché Google ha introdotto la TextInputLayoutparte di design-support-library.

Di seguito un esempio di base:

disposizione

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

Nota: impostando app:errorEnabled="true"come attributo di TextInputLayoutnon cambierà la sua dimensione una volta che viene visualizzato un errore, quindi sostanzialmente blocca lo spazio.

Codice

Per mostrare l'errore di seguito EditTextè sufficiente chiamare #setErroril TextInputLayout(NON sul bambino EditText):

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

Risultato

immagine che mostra il testo di modifica con il messaggio di errore

Per nascondere l'errore e ripristinare la tinta è sufficiente chiamare til.setError(null).


Nota

Per poter utilizzare il TextInputLayoutdevi aggiungere quanto segue alle tue build.gradledipendenze:

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

Impostazione di un colore personalizzato

Di default la linea del EditTextsarà rossa. Se è necessario visualizzare un colore diverso, è possibile utilizzare il seguente codice non appena si chiama setError.

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

Per cancellarlo è sufficiente chiamare la clearColorFilterfunzione, in questo modo:

editText.getBackground().clearColorFilter();

3
Sì ! Questo è tutto ! Come si fa a rendere rossa la linea?
km

3
@kmn Rendere la linea rossa non esce dalla scatola, quindi è necessario farlo da soli. Vedi la mia modifica. In termini di spostamento del suggerimento: non è possibile.
ripetere il

5
@Alessio Sto solo cercando di dire che dovrebbe funzionare quando estendi AppCompatActivity. Tuttavia: A partire da appcompat-v23 non è più necessario impostare colorFilter, non appena si chiama textInputLayout.setError("Error messsage")il colore di EditTextdovrebbe diventare rosso. Per ripristinarlo, è sufficiente chiamare textInputLayout.setError(null).
annulla il

3
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);non è più necessario con l'ultima libreria di supporto
Antoine Bolvy del

13
Volevo solo notare, dal momento che è un dettaglio così piccolo: stavo avendo questo problema chiamando setError sul EditText, non sul TextInputLayout. Ho visto questa risposta e non riuscivo ancora a capire cosa avrei dovuto cambiare. Cosa molto facile da perdere.
h_k,

8

Chiama myTextInputLayout.setError()invece di myEditText.setError().

Questi contenitori e contenitori hanno una doppia funzionalità nell'impostazione degli errori. La funzionalità di cui hai bisogno è quella del container. Ma potresti richiedere una versione minima di 23 per questo.


7

Il tuo EditTextdovrebbe essere avvolto in unTextInputLayout

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

Per visualizzare un messaggio di errore come desiderato, impostare l'errore su TextInputLayout

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

È necessario aggiungere la dipendenza della libreria di supporto alla progettazione. Aggiungi questa riga nelle tue dipendenze di livello

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

4

La risposta di reVerse è ottima, ma non ha indicato come rimuovere il tipo di cosa del tooltip di errore mobile

Dovrai edittext.setError(null)rimuoverlo.
Inoltre, come qualcuno ha sottolineato, non è necessarioTextInputLayout.setErrorEnabled(true)

disposizione

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

Codice

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 non necessario
JacksOnF1re

0

Se qualcuno sta ancora affrontando l'errore con l'utilizzo della libreria di design di Google come indicato nella risposta, si prega di utilizzare questo come commentato da @h_k che è -

Invece di chiamare setError su TextInputLayout , potresti usare setError su EditText stesso.


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

Quando rispondi a una vecchia domanda, la tua risposta sarebbe molto più utile per gli altri utenti StackOverflow se includessi un contesto per spiegare come la tua risposta aiuta, in particolare per una domanda che ha già una risposta accettata. Vedi: Come scrivo una buona risposta .
David Buck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.