No se puede setError dentro de un cuadro de diálogo que se cierra por sí mismo

Como el título, estoy enfrentando problemas al establecer un error dentro de EditText mEditText .

  private AlertDialog.Builder buildDialog(String mailString) { final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(LoginActivity.this); alertDialogBuilder.setTitle("Insert mail"); alertDialogBuilder.setMessage("email"); // Set an EditText view to get user input mMailEditText = new EditText(LoginActivity.this); if (mailString != null) mMailEditText.setText(mailString); alertDialogBuilder.setView(mMailEditText); alertDialogBuilder.setPositiveButton( "Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String email = mMailEditText.getText().toString(); if (!TextUtils.isEmpty(email) && !isEmailValid(email)) { mMailEditText.setError(getString( R.string.activity_login_error_invalid_email)); } else { attemptLoginOrRegister(UserTasks.REGISTER, email); } } }); alertDialogBuilder.setNegativeButton( "Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }); mAlertDialog = alertDialogBuilder.create(); return alertDialogBuilder; } private void setListeners() { mRegisterButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { buildDialog(null).show(); } }); } 

setListeners() siempre se llama desde onCreate , mientras que buildDialog se llama cuando el usuario realiza un clic en el botón de registro. Depurando la aplicación, la línea que contiene mMailEditText.setError() se ejecuta correctamente si el correo electrónico no es válido, pero el mensaje de error no se muestra y el diálogo se cierra simplemente. ¿Cuál es incorrecto con mi acercamiento?

EDIT: si lo desea, aquí está una versión simplificada del código de clase que no requiere ninguna biblioteca externa. También he añadido archivos de diseño y cadenas .

Usted ha ido para el enfoque correcto aunque usted necesita cambiar su código. Eche un vistazo al código siguiente:

  View view = getLayoutInflater().inflate(R.layout.custom_dialog, null); final EditText editTextEmail = (EditText) view.findViewById(R.id.editCategory); final AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this) .setView(view) .setPositiveButton(R.string.str_ok, null) .setNegativeButton(R.string.str_cancel, null) .create(); alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { Button buttonPositive = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE); buttonPositive.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Do whatever you want when positive button is clicked }); Button buttonNegative = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_NEGATIVE); buttonNegative.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Do whatever you want when negative button is clicked } }); } }); alertDialog.show(); 

Cree un diseño XML que incluya el EditText que desee. Inflar el diseño en una vista y pasar esa vista en el método AlertDialog de la instancia de AlertDialog . Simplemente anule setOnShowListener usando la instancia de AlertDialog . Después, recupere los botones positivo y negativo como se muestra arriba. Eso es.

  • DialogFragment de Android vs Diálogo
  • Android fondo de diálogo personalizado
  • ¿Cómo se muestra un diálogo de alerta en Android?
  • Eliminar fondo blanco en dialogfragment
  • Diálogo de Android - Fondo personalizado en lugar de atenuar o difuminar
  • Android Alert Dialog Fondo de aplicación API 11+
  • Agregar botón positivo / negativo al cuadro de diálogo de DialogFragment
  • Cómo abrir un cuadro de diálogo de una entrada de texto en una pantalla de preferencia?
  • Crear un cuadro de diálogo personalizado con lista de botones de radio
  • Tema de diálogo de AppCompat con la barra de título de Mis-color - ¿Bug?
  • El botón AlertDialog no existe
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.