Empêcher la fermeture du dialogue D'Activité Android sur le toucher extérieur

j'ai une activité qui utilise le Thème.Style de dialogue tel que c'est une fenêtre flottante au-dessus d'une autre activité. Cependant, lorsque je clique à l'extérieur de la fenêtre de dialogue (sur l'activité de fond), le dialogue se ferme. Comment puis-je arrêter ce comportement?

162
demandé sur Fergusmac 2012-08-24 07:29:39

18 réponses

Cela pourrait vous aider. C'est une façon de gérer l'événement touch outside:

comment annuler une activité sur le thème D'un dialogue lorsqu'elle est touchée à l'extérieur de la fenêtre?

en prenant 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 et non pour se fermer lorsque vous touchez l'extérieur.

(PS: le code utilise WindowManager.LayoutParams)

32
répondu Michel-F. Portzert 2017-05-23 12:10:48

pour empêcher la boîte de dialogue de se faire rejeter sur la touche de retour pressée utiliser ce

dialog.setCancelable(false);

et pour empêcher la boîte de dialogue de se faire rejeter sur l'extérieur de toucher utiliser ce

 dialog.setCanceledOnTouchOutside(false);
320
répondu Singhak 2016-11-30 08:40:52

ce que vous avez réellement est une activité (même si elle ressemble à un dialogue), par conséquent vous devez appeler setFinishOnTouchOutside(false) de votre activité si vous voulez la garder ouverte lorsque l'activité de fond est cliquée.

EDIT: cela ne fonctionne qu'avec L'API android de niveau 11 ou plus""

106
répondu artex 2013-04-24 14:55:07

ce qui a fonctionné pour moi était de créer DialogFragment un ensemble à ne pas être cancelable:

dialog.setCancelable(false);
31
répondu Petr 2018-05-07 12:18:06

pour L'API 10 supérieure, la boîte de dialogue disparaît lorsqu'elle est touchée à l'extérieur, alors qu'en dessous de L'API 11, la boîte de dialogue ne disparaît pas. Pour éviter cela, vous devez faire:

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

ou

dans onCreate() méthode, utiliser: this.setFinishOnTouchOutside(false);

Note: pour L'API 10 et inférieure, cette méthode n'a pas d'effet, et n'est pas nécessaire.

16
répondu Andreyua 2014-04-20 23:35:34

utilisez ce Code ça marche pour moi

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

11
répondu Aslam Patel 2016-01-02 09:51:19

définir la boîte de dialogue cancelable à false est suffisant, et soit vous touchez en dehors de la boîte de dialogue Alerte ou cliquez sur le bouton Précédent fera disparaître la boîte de dialogue Alerte. Alors utilisez celle-ci:

setCancelable(false)

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

si vous créez un dialogue temporaire et vous demandez là pour mettre cette ligne de code, Voici un exemple:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();
11
répondu BillOverFlow 2017-06-12 07:01:45
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.

voir ce lien pour plus de détails sur le dialogue .

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
9
répondu anand krish 2018-03-27 06:17:46

si vous utilisez dialog comme activité dans l'onCreate, ajouter

setFinishOnTouchOutside(false);
8
répondu Ronny Shibley 2017-04-01 10:05:47

tout Simplement,

alertDialog.setCancelable(false);

empêcher l'utilisateur de cliquer à l'extérieur de la Boîte de Dialogue.

8
répondu 2017-05-19 18:45:06

utiliser setFinishOnTouchOutside(false) pour API > 11 et ne vous inquiétez pas, car le comportement par défaut de son android que le thème de dialogue activity ne sera pas terminé sur outside touch pour API < 11:)!!Cheerss!!

5
répondu Vishal Pandey 2014-08-25 03:45:41

- je l'utiliser dans onCreate(), semble fonctionner sur n'importe quelle version d'Android; testé sur 5.0 et 4.4.x, ne peut pas tester sur pain d'épice, des appareils Samsung (Note 1 GO) de cette manière 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);
5
répondu 3c71 2014-12-17 16:10:21
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

je suppose que cela vous aidera.Il a fonctionné pour moi

3
répondu user2532065 2015-09-14 02:38:58

voici ma solution:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);
3
répondu Akhter Alamin Farhan 2016-04-12 04:37:32

je faisais face au même problème. Pour le gérer, j'ai placé un OntouchListener dans la boîte de dialogue et je ne fais rien à l'intérieur. Mais dialogue rejeter en tournant l'écran aussi. Pour le corriger, j'ai défini une variable pour me dire si la boîte de dialogue A Normalement été rejetée. Puis j'ai mis un OnDismissListener dans ma boîte de dialogue et à l'intérieur je vérifie la variable. Si la boîte de dialogue a dismmiss normalement Je ne fais rien, ou bien je lance la boîte de dialogue à nouveau (et en définissant son état comme lors du rejet dans mon cas).

1
répondu Madara 2014-02-06 16:18:47

builder.setCancelable (false);


public void Mensaje(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();
}
1
répondu Alex Skriivordemgentschenfelde 2016-07-12 23:24:32

est également possible d'attribuer différentes actions mettant en œuvre onCancelListener:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});
0
répondu Adae Rodríguez 2015-09-21 14:33:07

C'est la réponse parfaite à toutes vos questions.... J'espère que vous aimez le codage dans 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();
-1
répondu Akshat Rasogi 2018-04-22 07:30:51