Empêcher le dialog d’activité Android de se fermer sur le toucher extérieur

J’ai une activité qui utilise le style Theme.Dialog de sorte qu’il s’agit d’une fenêtre flottante sur une autre activité. Cependant, lorsque je clique en dehors de la fenêtre de dialog (sur l’activité en arrière-plan), la boîte de dialog se ferme. Comment puis-je arrêter ce comportement?

Cela pourrait vous aider. C’est un moyen de gérer le toucher à l’extérieur de l’événement:

Comment annuler un thème de dialog comme Activité lorsque vous êtes touché en dehors de la fenêtre?

En attrapant l’événement et en ne faisant rien, je pense que vous pouvez empêcher la fermeture. Mais ce qui est étrange cependant, c’est que le comportement par défaut de votre dialog d’activité devrait être de ne pas se fermer lorsque vous touchez à l’extérieur.

(PS: le code utilise WindowManager.LayoutParams)

Pour éviter que la boîte de dialog ne soit rejetée sur la touche Retour, utilisez cette

dialog.setCancelable(false); 

Et pour éviter que la boîte de dialog ne soit rejetée par une touche extérieure, utilisez cette

  dialog.setCanceledOnTouchOutside(false); 

Ce que vous avez en réalité, c’est une activité (même si elle ressemble à un dialog). Par conséquent, vous devez appeler setFinishOnTouchOutside(false) partir de votre activité si vous souhaitez la garder ouverte lorsque l’utilisateur clique sur l’activité d’arrière-plan.

EDIT: Cela ne fonctionne qu’avec l’API Android niveau 11 ou supérieur

Ce qui a fonctionné pour moi, c’est de créer DialogFragment et de le définir pour ne pas pouvoir être annulé:

 dialog.setCancelable(false); 

Pour les API 10 supérieures, le dialog disparaît lorsqu’il est touché à l’extérieur, alors que dans l’API 11, le dialog ne disparaît pas. Pour éviter cela, vous devez faire:

Dans styles.xml : false

OU

Dans la méthode onCreate() , utilisez: this.setFinishOnTouchOutside(false);

Remarque: pour les API 10 et inférieures, cette méthode n’a pas d’effet et n’est pas nécessaire.

Utilisez ce code, ça marche pour moi

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

Définir la boîte de dialog annulable comme étant suffisante suffit, et soit vous appuyez sur en dehors de la boîte de dialog d’alerte ou cliquez sur le bouton Précédent pour faire disparaître la boîte de dialog d’alerte. Alors utilisez celui-ci:

setCancelable(false)

Et l’autre fonction n’est plus nécessaire: dialog.setCanceledOnTouchOutside(false);

Si vous créez un dialog temporaire et que vous vous posez la question pour mettre cette ligne de code, voici un exemple:

 new AlertDialog.Builder(this) .setTitle("Trial Version") .setCancelable(false) .setMessage("You are using sortingal version!") .setIcon(R.drawable.time_left) .setPositiveButton(android.R.ssortingng.yes, null).show(); 
 Dialog dialog = new Dialog(context) dialog.setCanceledOnTouchOutside(true); //use this to dismiss the dialog on outside click of dialog dialog.setCanceledOnTouchOutside(false); //use this for not to dismiss the dialog on outside click of dialog. 

Regardez ce lien pour plus de détails sur la boîte de dialog.

 dialog.setCancelable(false); //used to prevent the dismiss of dialog on backpress of that activity dialog.setCancelable(true); //used to dismiss the dialog on onbackpressed of that activity 

Simplement,

 alertDialog.setCancelable(false); 

empêcher l’utilisateur de cliquer en dehors de la boîte de dialog.

Lors de l’utilisation de la boîte de dialog en tant qu’activité dans onCreate, ajoutez ceci

 setFinishOnTouchOutside(false); 

Utilisez setFinishOnTouchOutside(false) pour l’API> 11 et ne vous inquiétez pas car le comportement par défaut de cet android pour cette boîte de dialog sur les activités ne sera pas fini sur le toucher extérieur de l’API <11 :) !!

Je l’utilise dans onCreate (), semble fonctionner sur n’importe quelle version d’Android; testé sur 5.0 et 4.4.x, impossible de tester sur Gingerbread, les appareils Samsung (Note 1 sous GB) l’ont par défaut:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setFinishOnTouchOutside(false); } else { getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); } super.onCreate(savedInstanceState); 
  alert.setCancelable(false); alert.setCanceledOnTouchOutside(false); 

Je suppose que cela vous aidera.Il a travaillé pour moi

Voici ma solution:

 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select The Difficulty Level"); builder.setCancelable(false); 

Je faisais face au même problème. Pour y faire face, je OntouchListener un OntouchListener dans la boîte de dialog et ne fais rien à l’intérieur. Mais Dialog rejette également lors de la rotation de l’écran. Pour résoudre ce problème, je définis une variable pour me dire si la boîte de dialog a normalement été rejetée. Ensuite, je OnDismissListener un OnDismissListener à ma boîte de dialog et à l’intérieur je vérifie la variable. Si le dialog a normalement lieu, je ne le fais pas, sinon je relance le dialog (et définit son état comme si je le renvoyais dans mon cas).

builder.setCancelable (false);


Mensaje annulé (View v) {

  AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("¿Quieres ir a el Menú principal?"); builder.setMessage("Al presionar SI iras a el menú y saldras de la materia."); builder.setPositiveButton("SI", null); builder.setNegativeButton("NO", null); builder.setCancelable(false); builder.show(); } 

Il est également possible d’atsortingbuer différentes actions mettant en œuvre onCancelListener:

 alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ @Override public void onCancel(DialogInterface dialogInterface) { //Your custom logic } }); 

Ceci est la réponse parfaite à toutes vos questions …. J’espère que vous apprécierez le codage sous Android

 new AlertDialog.Builder(this) .setTitle("Akshat Rastogi Is Great") .setCancelable(false) .setMessage("I am the best Android Programmer") .setPositiveButton("I agree", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create().show();