2011-11-28 2 views
1

Je vais avoir la question suivante dans le développement Android 2.2 (API 8):Android Dialog rejette au lieu d'annuler

J'ai une classe personnalisée de dialogue comme celui-ci:

public AuthDialog(final Context context, OnDismissListener dismissListener, OnCancelListener cancelListener) { 
    super(context); 
    setOnDismissListener(dismissListener); 
    setOnCancelListener(cancelListener); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.userpassdialog); 
    setTitle("Enter email and password"); 
    setCancelable(true); 
    setCanceledOnTouchOutside(true); 
    authEmail = (EditText) findViewById(R.id.authEmail); 
    authPass = (EditText) findViewById(R.id.authPass); 
    alertMessage = (TextView) findViewById(R.id.auth_alert); 
    Button authButton = (Button) findViewById(R.id.authButton); 
    View.OnClickListener onClickListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      if (checkCredentials()) 
       dismiss(); 
      else 
       showAlert(); 
     } 
    }; 
    authButton.setOnClickListener(onClickListener); 
} 

private void showAlert() { 
    alertMessage.setText("Wrong user/pass"); 
    authEmail.setText(null); 
    authPass.setText(null); 
} 

private boolean checkCredentials() { 
    // Empty user/pass for now 
    boolean checkEmail = authEmail.getText().toString().equals(""); 
    boolean checkPassword = authPass.getText().toString().equals(""); 
    return checkEmail && checkPassword; 
} 

@Override 
public void onBackPressed() { 
    cancel(); 
} 

Et créer un nouveau AuthDialog comme ceci:

private void authenticateThenAccept() { 
    OnDismissListener dismissListener = new OnDismissListener() { 
     @Override 
     public void onDismiss(DialogInterface dialog) { 
      accept(); 
     } 
    }; 
    OnCancelListener cancelListener = new OnCancelListener() { 
     @Override 
     public void onCancel(DialogInterface dialog) { 
      cancel(); 
     } 
    }; 
    AuthDialog dialog = new AuthDialog(context, dismissListener, cancelListener); 
    dialog.show(); 
} 

J'utilise le débogueur, et je vois que quand je résilie (en utilisant le bouton de retour ou en appuyant sur l'extérieur de la boîte de dialogue) l'application rejette la boîte de dialogue au lieu d'annuler.

Quelqu'un at-il eu ce genre de problème avec Dialogs?

Merci à l'avance.

Répondre

2

En supposant que cette boîte de dialogue doit être modale, faites de votre boîte de dialogue une nouvelle activité. SetCancelable (false) empêchera le bouton de retour de faire quoi que ce soit.

+0

Enfin, j'ai utilisé une méthode Activity et startActivityForResult pour les valeurs attendues. Je vous remercie. –

+0

IMHO, On dirait que l'overkill. La réponse de Kalle explique ce qui se passe; une façon de travailler avec ce fait serait d'annuler mettre un drapeau, de sorte que rejeter sait qu'il s'agissait d'une annulation. – ToolmakerSteve

0

De nombreux développeurs désactivent simplement la possibilité de fermer le dialogue à l'aide du bouton de retour, car il n'est pas certain qu'il s'agisse d'une action d'annulation ou d'annulation pour l'utilisateur. OnDismiss() est toujours déclenché lorsque la boîte de dialogue se ferme.

+0

Non. J'ai désactivé le bouton de retour, créé un bouton Annuler et il rejette encore la boîte de dialogue. –

10

La documentation de setOnCancelListener() indique: "Ceci ne sera invoqué que lorsque la boîte de dialogue est annulée, si le créateur a besoin de savoir quand il est rejeté, utilisez setOnDismissListener", c'est-à-dire non onCancel ou onDismiss mais la boîte de dialogue est annulée. Je suis d'accord pour dire que cela aurait été plus logique si cela n'avait pas été le cas.