Respuestas:
No es necesario usar una biblioteca de terceros ya que Google introdujo el TextInputLayoutcomo 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 EditTextsimplemente necesita llamar #setErroral 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 TextInputLayoutdebe agregar lo siguiente a sus build.gradledependencias:
dependencies {
compile 'com.android.support:design:25.1.0'
}
Por defecto, la línea de EditTextserá 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 clearColorFilterfunción, así:
editText.getBackground().clearColorFilter();
textInputLayout.setError("Error messsage")al color del EditTextdeberí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 EditTextdebe 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 envuelvaEditTexto lo agregue. Ver github.com/rengwuxian/MaterialEditText .