Hoe een DialogFragment te verwijderen bij het drukken buiten het dialoogvenster?

Ik gebruik een DialogFragment en terwijl ik met succes een afbeelding heb ingesteld om het dialoogvenster te sluiten (dwz te sluiten) wanneer ik erop druk, vind ik het moeilijk om de weg te vinden om het dialoogvenster te sluiten wanneer de gebruiker ergens klikt daarbuiten, net zoals het werkt met normale dialogen. Ik dacht dat er een soort van zou zijn

dialogFragment.setCanceledOnTouchOutside(true);

bel, maar dat zie ik niet in de documentatie.

Is dit mogelijk met DialogFragment ? Of kijk ik op de verkeerde plekken? Ik probeerde tijdens de 'ouder'-activiteit aanrakinggebeurtenissen te onderscheppen, maar los van het feit dat ik geen aanraakgebeurtenis kreeg, leek het mij niet goed.

62

7 antwoord

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Moet worden aangeroepen in onCreateView (zoals Apurv Gupta opmerkt).

144
toegevoegd
Wat als ik niet wil dat het annuleert, maar in plaats daarvan gewoon sluit?
toegevoegd de auteur jjxtra, de bron
Moet worden aangeroepen in onCreateView
toegevoegd de auteur Apurv Gupta, de bron
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }
51
toegevoegd
в моем случае getDialog (). setCanceledOnTouchOutside (true); не сработало, сработало getDialog (). dismiss ();
toegevoegd de auteur Максим Фомичёв, de bron
    /** 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;
    }
18
toegevoegd
dit werkte niet voor mij. Ik moest setCanceledOnTouchOutside aanroepen in onCreateView volgens @Apurv. Ik moet vermelden dat ik setCanceledOnTouchOutside (false) heb aangeroepen
toegevoegd de auteur kimbaudi, de bron

Veel antwoOFden hier, maar de app crasht wanneer het dialoogvenster wOFdt geopend. Het schrijven van getDialog (). SetCanceledOnTouchOutside (true); inside onCreateView werkte niet en crashte mijn app.

(Ik gebruik AppCompatActivity als mijn BaseActivity en android.app.DialogFragment als mijn fragment).

Wat werkt is een van de volgende twee regels:

getDialog() setCanceledOnTouchOutside (true);.

OF

this.getDialog() setCanceledOnTouchOutside (true);.

binnen onActivityCreated zoals

@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
    }

Wat niet gebruiken:

DialogFragment.getDialog() setCanceledOnTouchOutside (false).

throws following errOF

enter image description here

En het schrijven van de code in onCreateView crasht de app! Werk het antwoord bij als u iets verkeerd vindt.

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

Het was verkeerd getypt. Ik had hetzelfde probleem. Dit werkt prima voor Java en Mono voor Android Mono zal zijn:

this.getDialog().SetCanceledOnTouchOutside(false);
1
toegevoegd

Ik zou aanraden om mijn oplossing alleen te gebruiken na het uitproberen van bovenstaande oplossingen. Ik heb mijn oplossing hier beschreven. Gewoon kort en bondig controleer ik de grenzen van DialogFragment.getView (). Als de aanraakpunten buiten DialogFragment liggen, wordt de dialoog afgewezen.

0
toegevoegd
            Dialog.SetCanceledOnTouchOutside(true);

Werkte voor mij
Mijn 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
toegevoegd
Je bent dichtbij, maar niet goed!
toegevoegd de auteur sud007, de bron