2015-10-20 24 views
11

Ho riscontrato un problema durante la creazione di un modulo di accesso. Ho mostrato alcuni errori sul mio TextInputLayout e li ho disabilitati, quando l'utente ha inserito qualcosa correttamente.TextInputLayout setErrorEnabled non crea un nuovo oggetto TextView

error example

I set con

mTextInputLayout.setError("This field is required"); 

e disabilitarlo con

mTextInputLayout.setError(null); 

problema è che ci sono ancora imbottiture dell'oggetto TextView vuoto, che mostrava il messaggio di errore . Così ho provato a disabilitare completamente l'errore con l'impostazione

mTextInputLayout.setErrorEnabled(false); 

e funziona e sembra soddisfacente, MA non riesco ad impostarlo di nuovo. Quando si chiama

mTextInputLayout.setErrorEnabled(true); 
mTextInputLayout.setError("This field is required"); 

ancora una volta vedo solo una linea di lettura, non il messaggio di errore, a quanto pare la TextView che è stato mostrato il messaggio di errore è stato distrutto e non ha creato di nuovo.

Ho letto here, che gli oggetti TextView vengono distrutti, quando viene chiamato setErrorEnabled(false) e sembra che non venga creato di nuovo. Bug o funzionalità?

The source for this control is not yet available in AOSP so I used the decompiler built in to Android Studio to examine the code to understand what was going wrong. I found that setErrorEnabled() actually creates and destroys a TextView object, whereas I was expecting it to simply toggle the visibility.

risposta

9

Nel caso in cui qualcuno affronta lo stesso problema, ho trovato una soluzione che funziona bene. Basta impostare la visibilità dell'oggetto TextView errore on e off, non distruggere l'oggetto.

Utilizzare questo per abilitare il messaggio di errore:

if (textInputLayout.getChildCount() == 2) 
    textInputLayout.getChildAt(1).setVisibility(View.VISIBLE); 

textInputLayout.setError("This field is required"); 

e questo per disabilitare il messaggio di errore:

textInputLayout.setError(null); 

if (textInputLayout.getChildCount() == 2) 
    textInputLayout.getChildAt(1).setVisibility(View.GONE); 
+1

Grazie, stavo affrontando lo stesso problema. Non so perché Google sia implementato in questo modo, ma questo è orribile che setErrorEnabled (true) non funziona come previsto -> l'errore non è visibile dopo setErrorEnabled (true) se abbiamo chiamato setErrorEnabled (false) prima – Ragaisis

+0

sto affrontando java. lang.NoClassDefFoundError: Risoluzione fallita di: Landroid/support/v7/internal/widget/TintManager; su android.support.design.widget.TextInputLayout.setError (TextInputLayout.java: 379) a textInputLayout.setError (null); –

+0

Stai importando la libreria di supporto di Android nel tuo progetto (nel tuo file build.gradle)? dipendenze { compile 'com.android.support:design:23.1.0' } – dabo

0

partire dalla libreria di supporto versione 23.1.1 (e forse anche prima), chiamando setErrorEnabled (false) rimuoverà l'errore TextView e farà in modo che TextInputLayout visualizzi un nuovo errore quando viene successivamente chiamato setError (String).

Tuttavia, esiste ancora un bug in cui il padding aggiuntivo non viene rimosso dal layout una volta che il messaggio di errore è stato cancellato. Questo bug può essere aggirato utilizzando posta @ di dabo sopra:

https://code.google.com/p/android/issues/detail?id=200137