web-dev-qa-db-fra.com

Empêcher le bouton Précédent de fermer une boîte de dialogue

J'essaie d'empêcher la fermeture d'une boîte AlertDialog lorsque vous appuyez sur le bouton Précédent dans Android. J'ai suivi les deux méthodes populaires dans ce fil , et avec System.out.println, je peux voir que dans les deux cas, le code est exécuté. Cependant, le bouton Précédent still ferme la boîte de dialogue.

Que pourrais-je faire de mal? 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 lors de la première exécution de l'application et je ne souhaite pas que l'utilisateur ait la possibilité d'appuyer sur le bouton "Accepter" commander pour que l'application continue.

57
CaptainProg

Utilisez simplement la fonction setCancelable() :

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

Cela empêche le bouton Précédent 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 veut pas accepter vos conditions de service peut appuyer sur le bouton d'accueil, à la lumière du commentaire de Squonk, voici deux autres moyens de les empêcher de «se retirer» du contrat d'utilisation. L'un est un simple bouton "Refuser" et l'autre remplace le bouton Retour dans la boîte de dialogue:

builder.setNegativeButton("Refuse", 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;
           }
       });
142
Sam

Pour éviter que le bouton Précédent ferme un 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) {
        // Prevent dialog close on back press button
        return keyCode == KeyEvent.KEYCODE_BACK;
    }
});
14
falvojr

Lorsque vous utilisez DialogFragment, vous devrez appeler setCancelable() sur le fragment, pas le dialogue:

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

    return dialog;
}

Appeler dialog.setCancelable() semble n'avoir aucun effet. Il semble que DialogFragment ne prenne pas en compte le paramètre d'annulation de la boîte de dialogue. 

7
Ognyan

Utilisez setCancelable(false)

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

Dans JQuery Mobile, une fenêtre contextuelle ajoute un hachage à l'URL, le code suivant permet de revenir à la fenêtre précédente lorsqu'elle est ouverte et de revenir à l'application lorsqu'elle est fermée. Vous pouvez utiliser la même logique pour un framework d'interface utilisateur personnalisé.

@Override
public void onBackPressed() {

    // check if modal is open #&ui-state=dialog

    if (webView.getVisibility() == View.VISIBLE && webView.getUrl().contains("#&ui-state=dialog")) {
        // don't pass back button action
        if (webView.canGoBack()) {
            webView.goBack();
        }
    } else {
        // pass back button action
        super.onBackPressed();
    }
}
0
Ricardo Saracino

Seulement cela a fonctionné pour moi:

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

/**
 * Make it when the Back button is pressed, the dialog isn't dismissed.
 */
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(), "There is no way back!");
            return true; // Consumed
        }
        else {
            return false; // Not consumed
        }
    }
});

Dialog dialog = builder.create();

/**
 * Make it so touching on the background activity doesn't close the dialog
 */
dialog.setCanceledOnTouchOutside(false);

return dialog;

Comme vous pouvez le constater, j’ai également ajouté une ligne dialog.setCanceledOnTouchOutside(false);, ce qui évite de fermer le dialogue.

0
ban-geoengineering