web-dev-qa-db-fra.com

Comment supprimer un DialogFragment lorsqu’on appuie en dehors du dialogue?

J'utilise une DialogFragment et, bien que j'aie paramétré avec succès une image pour fermer le dialogue lorsqu'elle est enfoncée, j'ai du mal à trouver le moyen de fermer le dialogue lorsque l'utilisateur clique n'importe où en dehors, comme cela fonctionne avec des dialogues normaux. Je pensais qu'il y aurait une sorte de 

dialogFragment.setCanceledOnTouchOutside(true);

appeler, mais je ne le vois pas dans la documentation.

Est-ce possible avec DialogFragment du tout? Ou est-ce que je cherche au mauvais endroit? J'ai essayé d'intercepter des événements tactiles dans l'activité 'parent', mais à part ne pas recevoir d'événement tactile, cela ne me semblait pas correct.

67
sole
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Doit être appelé dans onCreateView (comme l'a souligné Apurv Gupta). 

153
Hamed
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }
54
manuzhang
    /** The system calls this only when creating the layout in a dialog. */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }
19
Yakiv Mospan

Beaucoup de réponses ici, mais le blocage de l'application lorsque la boîte de dialogue s'ouvre. L'écriture de getDialog().setCanceledOnTouchOutside(true); à l'intérieur de onCreateView n'a pas fonctionné et mon application est tombée en panne.

(J'utilise AppCompatActivity comme baseActivity et Android.app.DialogFragment comme fragment).

Ce qui fonctionne est l'une des deux lignes suivantes:

getDialog (). setCanceledOnTouchOutside (true);

OR

this.getDialog (). setCanceledOnTouchOutside (true);

à l'intérieur onActivityCreated comme

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom;
        //getDialog().getWindow().setDimAmount(0.85f);
        getDialog().setCanceledOnTouchOutside(true);//See here is the code
    }

Quoi ne pas utiliser:

DialogFragment.getDialog (). SetCanceledOnTouchOutside (false);

jette l'erreur suivante

 enter image description here

Et écrire le code dans onCreateView bloque l'application! Veuillez mettre à jour la réponse si vous trouvez que quelque chose ne va pas.

4
sud007
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

C'était une erreur de frappe. J'ai eu le même problème. Cela fonctionne bien pour Java et Mono pour Android Mono sera:

this.getDialog().SetCanceledOnTouchOutside(false);
1
Eugene Bosikov

Je recommanderais d'utiliser ma solution uniquement après avoir essayé les solutions ci-dessus. J'ai décrit ma solution ici . Pour résumer, je vérifie les limites tactiles de DialogFragment.getView (). Lorsque les points de contact se trouvent en dehors de DialogFragment, je rejette le dialogue.

0
Swaroop
            Dialog.SetCanceledOnTouchOutside(true);

A travaillé pour moi
Mon code

class dlgRegister : DialogFragment
        {
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    ....
    ....
    }
    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
                Dialog.SetCanceledOnTouchOutside(true);
                base.OnActivityCreated(savedInstanceState);
                Dialog.Window.Attributes.WindowAnimations =    Resource.Style.dialog_animation;
            }
    }
0
sham