2011-06-28 23 views
16

Estoy usando un cuadro de diálogo de alerta de campo de texto simple con un botón positivo y uno de cancelación. Quiero validar mi diálogo de alerta y evitar que el botón hecho cierre el AlertDialog si la entrada no es válida.¿Hay alguna forma de evitar que AlertDialog se cierre con entradas no válidas?

¿Hay algún modo de crear un cuadro de diálogo personalizado para evitar que el controlador PositiveButton onClick() cierre el cuadro de diálogo si falla la validación?

class CreateNewCategoryAlertDialog { 
    final EditText editText; 
    final AlertDialog alertDialog; 

    class PositiveButtonClickListener implements OnClickListener { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      String name = editText.getText().toString(); 
      if(name.equals("")) { 
       editText.requestFocus(); 
       editText.setError("Please enter a name"); 
       // Some code to stop AlertDialog from closing goes here... 
      } else { 
       doSomethingUsefulWithName(); 
      } 
     } 
    } 

    AlertDialog buildAlertDialog(Context context) { 
     return new AlertDialog.Builder(context) 
     .setTitle(context.getString(R.string.enter_name)) 
     .setMessage(context.getString(R.string.enter_name_msg)) 
     .setView(editText) 
     .setPositiveButton(context.getString(R.string.done), new PositiveButtonClickListener()) 
     .setNegativeButton(context.getString(R.string.cancel), null).create(); 
    } 
} 
+0

Lo siento, me he dado cuenta de que esto es un duplicado de [esta pregunta (no aceptada)] (http://stackoverflow.com/q/4785571/403455). Lo cerraría como un duplicado, pero estoy buscando una mejor respuesta. Si la respuesta es "no", que así sea. –

+1

Crear su propio cuadro de diálogo personalizado parece ser el camino a seguir basado en [preguntas anteriores] (http://stackoverflow.com/questions/4016313/how-to-keep-an-alertdialog-open-after-button-onclick- Está despedido). Parece que esa será la solución más simple, y es lo que he tenido que hacer en el pasado. – theisenp

+0

Voy a votar tu pregunta. Veamos si la insignia Discplined se aplica a las preguntas :) – EboMike

Respuesta

9

Así es como lo hice. Técnicamente, técnicamente no mantiene el diálogo abierto, lo cierra momentáneamente y lo vuelve a abrir, pero el resultado neto es el mismo.

class MyAlertDialog implements OnDismissListener, OnCancelListener { 
    final private EditText editText; 
    final private AlertDialog alertDialog; 
    final private EventManager eventManager; 
    final private CategorySelector categorySelector; 

    private Boolean canceled; 

    MyAlertDialog(Context context) { 
     editText = new EditText(context); 
     alertDialog = buildAlertDialog(context); 
     alertDialog.setOnDismissListener(this); 
     alertDialog.setOnCancelListener(this); 
     show(); 
    } 

    private AlertDialog buildAlertDialog(Context context) { 
     return new AlertDialog.Builder(context) 
     .setTitle(context.getString(R.string.enter_name)) 
     .setMessage(context.getString(R.string.enter_name)) 
     .setView(editText) 
     .setNeutralButton(context.getString(R.string.save_text), null) 
     .setNegativeButton(context.getString(R.string.cancel_text), null) 
      .create(); 
    } 

    public void show() { 
     canceled = false; 
     alertDialog.show(); 
    } 

    @Override public void onDismiss(DialogInterface dialog) { 
     if(!canceled) { 
      final String name = editText.getText().toString(); 
      if(name.equals("")) { 
       editText.setError("Please enter a non-empty name"); 
       show(); 
      } else { 
       doWhateverYouWantHere(name); 
      } 
     } 
    } 

    @Override public void onCancel(DialogInterface dialog) { 
     canceled = true; 
    } 
} 
Cuestiones relacionadas