Wie kann ich ein DialogFragment schließen, wenn ich außerhalb des Dialogfelds drücke?

80

Ich verwende a DialogFragment, und obwohl ich erfolgreich ein Bild so eingestellt habe, dass das Dialogfeld beim Drücken geschlossen (dh geschlossen) wird, fällt es mir schwer, den Dialog zu schließen, wenn der Benutzer auf eine beliebige Stelle außerhalb des Dialogfelds klickt, so wie es funktioniert normale Dialoge. Ich dachte, es würde eine Art geben

dialogFragment.setCanceledOnTouchOutside(true);

Anruf, aber ich sehe das nicht in der Dokumentation.

Ist das überhaupt möglich DialogFragment? Oder suche ich an den falschen Stellen? Ich habe versucht, Berührungsereignisse in der Aktivität "Eltern" abzufangen, aber abgesehen davon, dass ich kein Berührungsereignis erhalten habe, schien es mir nicht richtig zu sein.

Sohle, einzig, alleinig
quelle

Antworten:

176
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Muss onCreateViewhinzugezogen werden (wie Apurv Gupta betonte).

Hamed
quelle
34
Muss angerufen werdenonCreateView
Apurv Gupta
Was ist, wenn ich nicht möchte, dass es abgebrochen wird, sondern nur geschlossen wird?
jjxtra
57
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }
Manuzhang
quelle
в моем случае getDialog (). setCanceledOnTouchOutside (true); не сработало, сработало getDialog (). entlassen ();
22аксим Фомичёв
@ МаксимФомичёв, в первом случае происходит установка свойства диалога, что его можно закрывать о Во втором случае вы сами программно закрываете диалог.
CoolMind
21
    /** 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;
    }
Yakiv Mospan
quelle
Das hat bei mir nicht funktioniert. Ich musste rufen setCanceledOnTouchOutsidein onCreateViewwie pro @Apurv. Ich sollte erwähnen, dass ichsetCanceledOnTouchOutside(false)
Kimbaudi
8

Viele Antworten hier, aber die App stürzt ab, wenn der Dialog geöffnet wird. Das Schreiben im getDialog().setCanceledOnTouchOutside(true);Inneren onCreateViewhat nicht funktioniert und meine App zum Absturz gebracht.

(Ich verwende AppCompatActivityals meine BaseActivity und android.app.DialogFragmentals mein Fragment).

Was funktioniert, ist eine der beiden folgenden Zeilen:

getDialog (). setCanceledOnTouchOutside (true);

ODER

this.getDialog (). setCanceledOnTouchOutside (true);

innen onActivityCreatedwie

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

Was nicht zu verwenden:

DialogFragment.getDialog (). SetCanceledOnTouchOutside (false);

löst folgenden Fehler aus

Geben Sie hier die Bildbeschreibung ein

Und das Schreiben des Codes onCreateViewstürzt in der App ab! Bitte aktualisieren Sie die Antwort, wenn Sie etwas falsch finden.

sud007
quelle
Dies liegt wahrscheinlich daran, dass Sie einen Dialog im Inneren erstellen onCreateDialog(), in dem dies eine übliche Art der Initialisierung ist. In diesem Fall onCreateView()tut nichts und enthält sogar keine Ansicht. Sie können versuchen, den Code nach zu verschieben onCreateDialog().
CoolMind
@CoolMind Oh, das ist eine schöne Beobachtung. Werde das sicher in meiner Versuchsliste behalten. Vielen Dank!
Sud007
Ich denke, Ihre Antwort macht dennoch Sinn, und 4 Personen haben Pluspunkte markiert. Ich hatte auch Probleme mit onCreateDialog, onCreateViewin der nahen Vergangenheit. Vielleicht irre ich mich, und Sie sollten behalten onActivityCreated, es ist eine gute Methode, um eine zusätzliche Initialisierung durchzuführen (siehe zum Beispiel stackoverflow.com/a/50734566/2914140 ).
CoolMind
@CoolMind schön, das funktioniert für dich. Ich kann jedoch feststellen, dass Probleme, die bei Ihnen auftreten, auf Ihre BottomSheetImplementierung zurückzuführen sind. Bei BSheet kann es anders sein, da stimme ich zu. Aber diese Lösung für a DialogFragmentfunktioniert gut.
Sud007
3
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

Es war falsch. Ich hatte das gleiche Problem. Dies funktioniert gut für Java und Mono für Android Mono wird sein:

this.getDialog().SetCanceledOnTouchOutside(false);
Eugene Bosikov
quelle
Aber wer hat etwas über Mono gefragt? : /
m0skit0
1
            Dialog.SetCanceledOnTouchOutside(true);

Arbeitete für mich
Mein 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;
            }
    }
Schein
quelle
1

Wenn Sie beim Klicken außerhalb von a eine Logik ausführen möchten DialogFragment, überschreiben Sie einfach die onCancel-Methode.

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // Do your work here
}
Thomas
quelle
0

Ich würde empfehlen, meine Lösung erst zu verwenden, nachdem Sie die oben genannten Lösungen ausprobiert haben. Ich habe meine Lösung hier beschrieben . Um es kurz zu machen, ich überprüfe die Berührungsgrenzen von DialogFragment.getView (). Wenn sich Berührungspunkte außerhalb von DialogFragment befinden, entlasse ich den Dialog.

Swaroop
quelle