Question

Je vais avoir la question suivante dans le développement Android 2.2 (API 8):

J'ai une classe de dialogue personnalisée comme ceci:

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 je crée une nouvelle 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.

Tout le monde a eu ce genre de problème avec Dialogs?

Merci d'avance.

Était-ce utile?

La solution

En supposant que ce dialogue doit être modale, faites votre dialogue une nouvelle activité.

Autres conseils

onDismiss () est toujours tiré lors de dialogue se ferme. La documentation de setOnCancelListener () déclare: « Ce ne sera que lorsque le dialogue est annulé, si les besoins de créateur de savoir quand il est licencié en général, l'utilisation setOnDismissListener » , à savoir qu'il est pas non plus onCancel ou onDismiss mais aussi quand une boîte de dialogue est annulée. Je suis d'accord bien que cela aurait été plus logique avait que pas été le cas.

setCancelable (false) empêchera le bouton de retour de faire quelque chose. De nombreux développeurs se tournent juste à côté de la capacité du bouton de retour pour fermer la boîte de dialogue car il ne sait pas que ce soit une annulation ou une action ok à l'utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top