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.
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;
}
});
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;
}
});
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.
Utilisez setCancelable(false)
SampleDialog sampleDialog = SampleDialog.newInstance();
sampleDialog.setCancelable(false);
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());
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();
}
}
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.