281 votes

Empêcher la fermeture de la boîte de dialogue d'activité Android en cas de contact extérieur

J'ai une activité qui utilise le style Theme.Dialog de telle sorte qu'elle constitue une fenêtre flottante au-dessus d'une autre activité. Cependant, lorsque je clique en dehors de la fenêtre de dialogue (sur l'activité en arrière-plan), la boîte de dialogue se ferme. Comment puis-je empêcher ce comportement ?

1 votes

Pourquoi tu ferais ça, d'ailleurs. Si le comportement que vous voulez est celui d'un dialogue, pourquoi ne pas utiliser un dialogue ? Pour en venir à votre question, je ne pense pas qu'il y ait une solution à cela.

0 votes

@KumarBibek Les boîtes de dialogue sont limitées lorsqu'il s'agit de personnaliser la mise en page... c'est pourquoi une activité. Même la documentation du développeur recommande cette approche pour une personnalisation flexible.

1 votes

Et ce que le PO veut est un Modal un dialogue, c'est-à-dire un dialogue qui oblige l'utilisateur à répondre, comme OK ou Oui/Non. L'utilisateur ne doit pas pouvoir s'éloigner d'un simple clic.

551voto

Singhak Points 911

Pour empêcher la boîte de dialogue d'être rejetée lorsque la touche retour est enfoncée, utilisez ceci

dialog.setCancelable(false);

Et pour empêcher la boîte de dialogue d'être rejetée lors d'une touche extérieure, utilisez ceci

 dialog.setCanceledOnTouchOutside(false);

7 votes

Cette réponse est utile mais cette question concerne l'activité utilisant l'attribut Theme.Dialog.

19 votes

Je sais que lorsque je m'en rends compte, il est trop tard, car il a aidé de nombreuses personnes et je ne l'ai pas supprimé.

13 votes

Je sais que cela ne se rapporte pas vraiment à la question, mais cela m'a aidé. Merci.

132voto

artex Points 435

Ce que vous avez en réalité est une activité (même si elle ressemble à un dialogue), vous devez donc appeler setFinishOnTouchOutside(false) de votre activité si vous voulez qu'elle reste ouverte lorsque l'on clique sur l'activité d'arrière-plan.

EDIT : Cela ne fonctionne qu'avec Android API niveau 11 ou plus.

5 votes

Cela ne vous empêche pas d'appuyer sur le bouton "retour" dans votre activité. Vous devez donc également remplacer onBackPressed() ne faisant rien dans son corps

0 votes

Il n'empêche le bouton "retour" dans cette activité de dialogue sans onBackPressed(). Cela fonctionne parfaitement avec this.setFinishOnTouchOutside(false).

87voto

petr Points 190

Ce qui a marché pour moi, c'est de créer DialogFragment et le régler pour qu'il ne soit pas annulable :

dialog.setCancelable(false);

2 votes

Pas utile. Cette question concerne les activités, pas les dialogues.

0 votes

Toutes les boîtes de dialogue appartiennent à la classe Dialog, dans le cas d'AlertDialog, il suffit de mettre cet indicateur à false et cela devrait fonctionner pour le toucher extérieur et le bouton retour.

34voto

Michel-F. Portzert Points 1209

Cela pourrait vous aider. Il s'agit d'un moyen de gérer l'événement "touch outside" :

Comment annuler une boîte de dialogue thématique comme Activity lorsqu'elle est touchée 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, c'est que le comportement par défaut de votre dialogue d'activité devrait être pas pour se fermer lorsque vous touchez l'extérieur.

(PS : le code utilise WindowManager.LayoutParams)

1 votes

L'objet n'est pas un dialogue, mais une activité qui utilise le style de dialogue. Activity ne possède pas cette méthode et ne peut pas être converti en Dialog.

0 votes

Votre message va à l'encontre de la question posée. Il a demandé comment empêcher la fermeture et non comment la provoquer.

4 votes

C'est ce qu'il a expliqué avec "En attrapant l'événement et en ne faisant rien, je pense que vous pouvez empêcher la fermeture".

19voto

Andreyua Points 8

Dans les versions supérieures à API 10, le dialogue disparaît lorsqu'on le touche à l'extérieur, alors que dans les versions inférieures à API 11, le dialogue ne disparaît pas. Pour éviter cela, vous devez faire ce qui suit :

Sur styles.xml : <item name="android:windowCloseOnTouchOutside">false</item>

O

Sur onCreate() méthode, utilisation : 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.

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