2010-05-09 40 views
5

Estoy usando un AlertDialog que es muy simple, solo una vista personalizada con un cuadro de texto y el botón de enviar mensaje de alerta positivo. Me gustaría validar que el cuadro de texto ha tenido texto ingresado antes de que el usuario cierre el diálogo. Veo dos posibilidades, con preguntas sobre cada uno:Entrada de cuadro de validación

  • deshabilitar el botón de enviar hasta que el cuadro texto no está vacío (en algunos onchange() Tipo de controlador para el cuadro de texto )
    • Cómo hacer ¿Sabes cuándo cambia el contenido del cuadro de texto?
    • ¿Cómo se obtiene una referencia al objeto del botón AlertDialog?
  • Comprobar en el botón de enviar onClick() y cancelar el despido del cuadro de diálogo si está vacío.
    • ¿Es posible hacer esto con el botón AlertDialog? El diálogo descarta sin llamar manualmente Rechazar() o cancelar(), así que no estoy seguro ...

es cualquiera de estas opciones posibles con un AlertDialog (vs un diálogo personalizado)?

Creo que la segunda opción sería la más simple, pero estoy dispuesto a hacerlo si es posible.

Respuesta

3

La manera más fácil que creo es definir su propio cuadro de diálogo en un archivo xml. A continuación, puede mostrarlo muy simple (en este ejemplo en algún lugar de la clase de actividad):

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

Aquí está una manera de validar la entrada y mantener un diálogo de alerta en la pantalla si la entrada no es válida. En realidad, elimina el diálogo y muestra una nueva copia.

En su función setPostiveButton's onClick, realice su validación. Si las cosas no son como deberían ser, muestre al usuario un Brindis. Luego llame a removeDialog en su cuadro de diálogo. Luego, y esta es la parte difícil, llame asincrónicamente a showDialog en su cuadro de diálogo (con args si corresponde). También: para no perder la entrada del usuario, debe colocar los valores que ingresaron en el paquete con el que invocó el diálogo. Y, por supuesto, su código de configuración para el diálogo necesita buscar esos valores en el paquete y rellenar los campos de diálogo de forma adecuada.

Así que su código sería algo como esto:

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

¿de dónde obtengo el id de diálogo? ¿Puedes dar un ejemplo mínimo y funcional? –

4

fijo una TextWatcher a un campo de entrada, y luego activar el botón positivo cuando se cumplen las condiciones de validación. Deshabilito el botón positivo por defecto.

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) { 

    } 
}); 
Cuestiones relacionadas