Risposte:
Non è necessario utilizzare una libreria di terze parti poiché Google ha introdotto la TextInputLayout
parte di design-support-library
.
Di seguito un esempio di base:
<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 TextInputLayout
non cambierà la sua dimensione una volta che viene visualizzato un errore, quindi sostanzialmente blocca lo spazio.
Per mostrare l'errore di seguito EditText
è sufficiente chiamare #setError
il TextInputLayout
(NON sul bambino EditText
):
TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");
Per nascondere l'errore e ripristinare la tinta è sufficiente chiamare til.setError(null)
.
Per poter utilizzare il TextInputLayout
devi aggiungere quanto segue alle tue build.gradle
dipendenze:
dependencies {
compile 'com.android.support:design:25.1.0'
}
Di default la linea del EditText
sarà 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 clearColorFilter
funzione, in questo modo:
editText.getBackground().clearColorFilter();
textInputLayout.setError("Error messsage")
il colore di EditText
dovrebbe diventare rosso. Per ripristinarlo, è sufficiente chiamare textInputLayout.setError(null)
.
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);
non è più necessario con l'ultima libreria di supporto
EditText
, non sul TextInputLayout
. Ho visto questa risposta e non riuscivo ancora a capire cosa avrei dovuto cambiare. Cosa molto facile da perdere.
Il tuo EditText
dovrebbe 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'
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);
TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");
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();
}
}
}
EditText
. Più probabilmente, avrai bisogno di qualcosa che lo avvolgaEditText
o lo aggiunga altrimenti. Vedi github.com/rengwuxian/MaterialEditText .