Respuestas:
No es necesario usar una biblioteca de terceros ya que Google introdujo el TextInputLayout
como parte de la design-support-library
.
Siguiendo un ejemplo básico:
<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: Al establecerlo app:errorEnabled="true"
como un atributo de TextInputLayout
, no cambiará su tamaño una vez que se muestra un error, por lo que básicamente bloquea el espacio.
Para mostrar el error debajo del EditText
simplemente necesita llamar #setError
al TextInputLayout
(NO al niño EditText
):
TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");
Para ocultar el error y restablecer el tinte, simplemente llame til.setError(null)
.
Para usar el TextInputLayout
debe agregar lo siguiente a sus build.gradle
dependencias:
dependencies {
compile 'com.android.support:design:25.1.0'
}
Por defecto, la línea de EditText
será roja. Si necesita mostrar un color diferente, puede usar el siguiente código tan pronto como llame setError
.
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);
Para borrarlo, simplemente llame a la clearColorFilter
función, así:
editText.getBackground().clearColorFilter();
textInputLayout.setError("Error messsage")
al color del EditText
debería volverse rojo. Para restablecerlo, es suficiente llamar textInputLayout.setError(null)
.
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);
ya no es necesario con la última biblioteca de soporte
EditText
, no en el TextInputLayout
. Vi esta respuesta y aún no podía entender qué necesitaba cambiar. Muy fácil de perder.
Tu EditText
debe estar envuelto en 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>
Para obtener un mensaje de error como lo desea, establezca el error en TextInputLayout
TextInputLayout tilEmail = (TextInputLayout) findViewById(R.id.tilEmail);
if (error){
tilEmail.setError("Invalid email id");
}
Debe agregar dependencia de biblioteca de soporte de diseño. Agregue esta línea en sus dependencias de gradle
compile 'com.android.support:design:22.2.0'
La respuesta de reVerse es excelente, pero no señaló cómo eliminar el tipo de información sobre herramientas de error flotante
Tendrás edittext.setError(null)
que eliminar eso.
Además, como alguien señaló, no necesitasTextInputLayout.setErrorEnabled(true)
Diseño
<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>
Código
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
. Lo más probable es que necesite algo que lo envuelvaEditText
o lo agregue. Ver github.com/rengwuxian/MaterialEditText .