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.
onCreateView
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getDialog().setCanceledOnTouchOutside(true); ... }
quelle
/** 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; }
quelle
setCanceledOnTouchOutside
inonCreateView
wie pro @Apurv. Ich sollte erwähnen, dass ichsetCanceledOnTouchOutside(false)
Viele Antworten hier, aber die App stürzt ab, wenn der Dialog geöffnet wird. Das Schreiben im
getDialog().setCanceledOnTouchOutside(true);
InnerenonCreateView
hat nicht funktioniert und meine App zum Absturz gebracht.(Ich verwende
AppCompatActivity
als meine BaseActivity undandroid.app.DialogFragment
als mein Fragment).Was funktioniert, ist eine der beiden folgenden Zeilen:
ODER
innen
onActivityCreated
wie@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:
löst folgenden Fehler aus
Und das Schreiben des Codes
onCreateView
stürzt in der App ab! Bitte aktualisieren Sie die Antwort, wenn Sie etwas falsch finden.quelle
onCreateDialog()
, in dem dies eine übliche Art der Initialisierung ist. In diesem FallonCreateView()
tut nichts und enthält sogar keine Ansicht. Sie können versuchen, den Code nach zu verschiebenonCreateDialog()
.onCreateDialog
,onCreateView
in der nahen Vergangenheit. Vielleicht irre ich mich, und Sie sollten behaltenonActivityCreated
, es ist eine gute Methode, um eine zusätzliche Initialisierung durchzuführen (siehe zum Beispiel stackoverflow.com/a/50734566/2914140 ).BottomSheet
Implementierung zurückzuführen sind. Bei BSheet kann es anders sein, da stimme ich zu. Aber diese Lösung für aDialogFragment
funktioniert gut.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);
quelle
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; } }
quelle
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 }
quelle
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.
quelle