web-dev-qa-db-fra.com

Empêchez la fermeture de la boîte de dialogue de l'activité Android _ de l'extérieur

Une activité utilisant le style Theme.Dialog est une fenêtre flottante par rapport à 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 arrêter ce comportement?

195
Fergusmac

Cela pourrait vous aider. C'est un moyen de gérer l'événement tactile extérieur:

Comment annuler un dialogue ayant pour thème une activité similaire à une activité hors 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é doit être et non de se fermer lorsque vous touchez à l’extérieur.

(PS: le code utilise WindowManager.LayoutParams)

32
Michel-F. Portzert

Pour éviter que la boîte de dialogue ne soit rejetée lorsque vous appuyez sur la touche Retour, utilisez cette commande.

dialog.setCancelable(false);

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

 dialog.setCanceledOnTouchOutside(false);
393
Singhak

Ce que vous avez réellement est une activité (même si elle ressemble à une boîte de dialogue), vous devez donc appeler setFinishOnTouchOutside(false) de votre activité si vous souhaitez la garder ouverte lorsque vous cliquez sur l'activité en arrière-plan.

ÉDITER: cela ne fonctionne qu'avec Android API de niveau 11 ou supérieur.

114
artex

Ce qui a fonctionné pour moi a été de créer DialogFragment et de ne pas pouvoir l’annuler:

dialog.setCancelable(false);
55
Petr

Pour l'API 10 supérieure, le dialogue disparaît lorsqu'il est touché à l'extérieur, alors que dans l'API 11 inférieure, le dialogue ne disparaît pas. Pour éviter cela, vous devez faire:

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

OR

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

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

17
ilw

Lors de l’utilisation de dialog comme activité dans onCreate, ajoutez ceci

setFinishOnTouchOutside(false);
16
Ronny Shibley

tilisez ce code ça marche pour moi

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

12
Aslam Patel

Il suffit de définir la boîte de dialogue annulable sur false. Si vous appuyez en dehors de la boîte de dialogue d'alerte ou cliquez sur le bouton Précédent, la boîte de dialogue d'alerte disparaîtra. Alors utilisez celui-ci:

setCancelable(false)

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

Si vous créez une boîte de dialogue temporaire et vous y demandez de 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
BillOverFlow
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 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
8
anand krish

Simplement,

alertDialog.setCancelable(false);

empêcher l'utilisateur de cliquer en dehors de la boîte de dialogue.

8
user7868389

Utilisez setFinishOnTouchOutside(false) pour l'API> 11 et ne vous inquiétez pas car son comportement par défaut pour Android, cette boîte de dialogue sur le thème de l'activité ne sera pas terminée pour API <11 :) !!

5
Vishal Pandey

J'utilise ceci dans onCreate (), semble fonctionner sur n'importe quelle version d'Android; testé sur les versions 5.0 et 4.4.x, ne peut pas être testé sur Gingerbread, les appareils Samsung (remarque 1 Go en cours d'exécution) l'ont par défaut comme suit:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);
5
3c71
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

Je suppose que cela vous aidera. Cela a fonctionné pour moi

4
user2532065

Voici ma solution:

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

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

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

Je faisais face au même problème. Pour le gérer, je mets un OntouchListener dans le dialogue et je ne fais rien à l'intérieur. Mais Dialog rejeter lors de la rotation de l'écran aussi. Pour résoudre ce problème, je mets une variable pour me dire si le dialogue a été normalement fermé. Ensuite, je mets un OnDismissListener dans ma boîte de dialogue et à l'intérieur, je vérifie la variable. Si la boîte de dialogue a perdu son respect, normalement je ne fais rien, sinon je l'exécute à nouveau (et il définit son état de la même manière que s'il la rejette dans mon cas).

1
Madara

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();
}