Diseña Android EditText para mostrar un mensaje de error como lo describe google

Necesito un EditText que se vea así onError:

enter image description here

llamar a onError se ve así en su lugar:

enter image description here

Nota: la aplicación se ejecuta en SDK 19 (4.4.2)

min SDK es 1

¿Existe un método similar a setError que hace esto automáticamente, o tengo que escribir el código para ello?

Gracias

No es necesario utilizar una biblioteca de terceros ya que Google presentó TextInputLayout como parte de la design-support-library .

Siguiendo un ejemplo básico:

Diseño

    

Nota: Al configurar la app:errorEnabled="true" como un atributo de TextInputLayout , no cambiará su tamaño una vez que se muestre un error, por lo que básicamente bloquea el espacio.

Código

Para mostrar el error debajo de EditText , simplemente debe llamar a #setError en TextInputLayout (NO en el EditText hijo):

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

Resultado

imagen que muestra el texto de edición con el mensaje de error

Para ocultar el error y restablecer el tinte simplemente llame a til.setError(null) .


Nota

Para utilizar TextInputLayout , debe agregar lo siguiente a sus dependencias build.gradle :

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

Establecer un color personalizado

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 a setError .

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

Para borrarlo, simplemente llame a la siguiente línea:

 editText.getBackground().clearColorFilter; 

Su EditText debe estar envuelto en un TextInputLayout

    

Para obtener un mensaje de error como el que quería, establezca el error en TextInputLayout

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

Debe agregar la dependencia de la biblioteca de soporte de diseño. Agregue esta línea en sus dependencias gradle

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

Llame myTextInputLayout.setError() lugar de myEditText.setError() .

Estos contenedores y contenciones tienen una doble funcionalidad en la configuración de errores. La funcionalidad que necesitas es la de contenedor. Pero podrías necesitar una versión mínima de 23 para eso.

La respuesta de reVerse es excelente, pero no señaló cómo eliminar el tipo de error flotante de la información sobre herramientas.

Necesitará edittext.setError(null) para eliminar eso.
Además, como alguien señaló, no necesita TextInputLayout.setErrorEnabled(true)

Diseño

    

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..");