2010-05-09 15 views
5

Sto utilizzando un AlertDialog che è molto semplice, solo una visualizzazione personalizzata con una casella di testo e il pulsante di invio positivo del messaggio di avviso. Vorrei verificare che la casella di testo abbia inserito il testo prima che l'utente abbia chiuso la finestra di dialogo. Vedo due possibilità, con domande su ciascuno:Ingresso di dialogo di convalida

  • disattivare il pulsante di invio fino a quando la casella testo non è vuota (in qualche onChange() digitare gestore per la casella di testo )
    • Come fare sai quando il contenuto della casella di testo cambia?
    • Come si ottiene un riferimento all'oggetto pulsante di AlertDialog?
  • Arrivo clic del pulsante di submit() e annullare la respingendo della finestra di dialogo se è vuota.
    • E 'possibile farlo con un pulsante di AlertDialog? La finestra di dialogo respinge senza chiamare manualmente respingere() o annullare(), quindi non sono sicuro ...

È una di queste opzioni possibili con un AlertDialog (vs una finestra personalizzata)?

Penso che la seconda opzione sarebbe la più semplice, ma sono sicuro che se è possibile.

risposta

3

Il modo più semplice è quello di definire la propria finestra di dialogo in un file xml. Poi si può visualizzare molto semplice (in questo esempio da qualche parte nella classe di attività):

Dialog dialog = new Dialog(this); 
dialog.setContentView(R.layout.your_dialog_file); 

Button yourButton = dialog.findViewById(R.id.yourButton); 
final EditText text = dialog.findViewById(R.id.yourTextEdit); 
yourButton.setOnClickListener({ 

public void onClick(View view) { 
    if (! (text.getText().toString.equals(""))) { 
     //go on here and dismiss dialog 
    } 

}); 
1

Ecco un modo per convalidare l'input e mantenere una finestra di avviso sullo schermo se l'ingresso non è valido. In realtà rimuove la finestra di dialogo e ne crea una nuova copia.

Nella funzione onClick del setPostiveButton, effettuare la convalida. Se le cose non sono come dovrebbero essere, mostra all'utente un Toast. Quindi chiama removeDialog nella finestra di dialogo. Quindi, e questa è la parte difficile, chiama in modo asincrono showDialog nella finestra di dialogo (con argomenti se possibile). Inoltre: per non perdere l'input dell'utente, dovresti inserire i valori che hanno inserito nel bundle con il quale invochi la finestra di dialogo. E, naturalmente, il codice di configurazione per la finestra di dialogo deve cercare quei valori nel gruppo e prepopolare i campi di dialogo in modo appropriato.

Così il vostro codice sarebbe simile a questa:

alert.setPositiveButton(id, 
new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) 
    { 
    if ((your validation conditions)) { 
     // validation conditions not satisfied 
     removeDialog(myDialogId); 
     Toast.makeText(blah blah).show(); 
     // now create a new args bundle for the dialog 
     Bundle newArgs = new Bundle(); 
     // now copy whatever you need from the args used to invoke to dialog 
     newArgs.putIntegerArrayList("items", myList); 
     // now save the user's input in a bundle 
     newArgs.putString("dialogToFieldContent", toString); 
     final Bundle finalArgs = newArgs; 
     Handler handler = new Handler(); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
      showDialog(myDialogId, finalArgs); 
      } 
     }); 
    } 
    else { 
     // if everything is ok 
    } 
    } 
}); 
+0

da dove viene visualizzato l'ID della finestra di dialogo? Potete per favore fornire un esempio minimale e funzionale !? –

4

Ho impostato un TextWatcher ad un campo di input, e quindi attivare il pulsante positiva quando sono soddisfatte le condizioni di validazione. Disabilito il pulsante positivo per impostazione predefinita.

AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity()); 
final View dialogView = LayoutInflater.from(getSherlockActivity()).inflate(R.layout.create_playlist, null); 
final EditText inputField = (EditText) dialogView.findViewById(R.id.edit_newPlaylistName); 
... //proceed to setup dialog using builder 
final AlertDialog alertDialog = builder.show(); 
alertDialog.setCanceledOnTouchOutside(true); 
final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); 
button.setEnabled(false); 
inputField.addTextChangedListener(new TextWatcher() { 
    @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     // my validation condition 
     if (inputField.getText().length() > 0) { 
      button.setEnabled(true); 
     } else { 
      button.setEnabled(false); 
     } 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 
}); 
Problemi correlati