82 votes

Empêcher le bouton de retour de fermer une boîte de dialogue

Je tente d'empêcher une boîte de dialogue AlertDialog de se fermer lorsqu'on appuie sur le bouton de retour dans Android. J'ai suivi les deux méthodes populaires dans ce fil, et avec System.out.println, je vois que dans les deux cas le code s'exécute. Cependant, le bouton de retour continue à fermer la boîte de dialogue.

Qu'est-ce que je pourrais faire de mauvais ? En fin de compte, j'essaie d'empêcher le bouton de retour de fermer une boîte de dialogue - il s'agit d'un avertissement qui s'affiche la première fois que l'application est lancée et je ne veux pas que l'utilisateur ait d'autre option que d'appuyer sur le bouton "Accepter" pour que l'application puisse continuer.

185voto

Sam Points 47925

Utilisez simplement la fonction setCancelable() :

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);

Cela empêche le bouton de retour de fermer la boîte de dialogue, mais laisse le bouton "négatif" intact si vous choisissez de l'utiliser.


Alors que tout utilisateur qui ne souhaite pas accepter vos conditions d'utilisation peut appuyer sur le bouton d'accueil, en réponse au commentaire de Squonk, voici deux autres moyens de les empêcher de "revenir en arrière" sur l'accord de l'utilisateur. L'un est un simple bouton "Refuser" et l'autre remplace le bouton de retour dans la boîte de dialogue :

builder.setNegativeButton("Refuser", new OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
               finish();
           }
       })
       .setOnKeyListener(new OnKeyListener() {
           @Override
           public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
               if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)
                   finish();
               return false;
           }
       });

24voto

falvojr Points 1000

Pour empêcher le bouton de retour de fermer une boîte de dialogue (sans dépendre de l'activité), il suffit d'utiliser le code suivant :

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        // Empêcher la fermeture de la boîte de dialogue en appuyant sur le bouton retour
        return keyCode == KeyEvent.KEYCODE_BACK;
    }
});

20voto

Ogre_BGR Points 4799

Lors de l'utilisation de DialogFragment, vous devrez appeler setCancelable() sur le fragment, et non sur la boîte de dialogue :

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    dialog = new ProgressDialog(getActivity());
    dialog.setIndeterminate(true);
    dialog.setMessage(...);
    setCancelable(false);

    return dialog;
}

Appeler dialog.setCancelable() semble ne pas avoir d'effet. Il semble que DialogFragment ne tient pas compte du paramètre de la boîte de dialogue pour la possibilité d'annulation.

4voto

David Points 2298

Utilisez setCancelable(false)

SampleDialog sampleDialog = SampleDialog.newInstance();
sampleDialog.setCancelable(false);
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());

1voto

Seule cette solution a fonctionné pour moi :

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(title);
builder.setMessage(content);

/**
 * Faire en sorte que lorsque le bouton de retour est pressé, la boîte de dialogue ne soit pas fermée.
 */
builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            Utilities.makeToast(getContext(), "Il n'y a pas de retour en arrière !");
            return true; // Consommé
        }
        else {
            return false; // Non consommé
        }
    }
});

Dialog dialog = builder.create();

/**
 * Faire en sorte que le fait de toucher à l'extérieur de la boîte de dialogue ne la ferme pas.
 */
dialog.setCanceledOnTouchOutside(false);

return dialog;

Comme vous pouvez le voir, j'ai également ajouté une ligne dialog.setCanceledOnTouchOutside(false); afin que le fait de toucher à l'extérieur de la boîte de dialogue ne la ferme pas non plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X