2011-06-28 11 views
16

Używam prostego okna dialogowego z polem tekstowym z przyciskiem dodatnim i przyciskiem anulowania. Chcę potwierdzić moje okno dialogowe alertu i zapobiec zakończeniu zamykania AlertDialog, jeśli dane wejściowe są nieprawidłowe.Czy istnieje sposób zapobiegający zamykaniu AlertDialog przy nieprawidłowych danych wejściowych?

Czy jest jakiś sposób na utworzenie niestandardowego okna dialogowego, aby uniemożliwić procedurę obsługi onClick() PositiveButton podczas zamykania okna dialogowego, jeśli sprawdzanie poprawności nie powiedzie się?

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

Niestety, Właśnie zauważyłem jest to duplikat [tej kwestii (nieodebranego)] (http://stackoverflow.com/q/4785571/403455). Zamknęłbym to jako duplikat, ale szukam lepszej odpowiedzi. Jeśli odpowiedź brzmi "nie", niech tak będzie. –

+1

Tworzenie własnego niestandardowego okna dialogowego wydaje się być sposobem na podstawie [poprzednich pytań] (http://stackoverflow.com/questions/4016313/how-to-keep-an-alertdialog-open-after-button-onclick- jest zwolniony). Wygląda na to, że będzie to najprostsze rozwiązanie i właśnie to musiałem zrobić w przeszłości. – theisenp

+0

Głosuję na twoje pytanie. Zobaczmy, czy odznaka Discplined dotyczy pytań :) – EboMike

Odpowiedz

9

Oto jak to zrobiłem. Z technicznego punktu widzenia technicznie nie otwiera okna dialogowego, zamyka je na chwilę i ponownie je otwiera, ale wynik netto jest taki sam.

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; 
    } 
} 
Powiązane problemy