How to correctly dismiss a DialogFragment?

android, android-dialogfragment

Solution

tl;dr: The correct way to close a `DialogFragment` is to use `dismiss()` directly on the DialogFragment.

Details: The documentation of DialogFragment states

Control of the dialog (deciding when to show, hide, dismiss it) should be done through the API here, not with direct calls on the dialog.

Thus, you should not use `getDialog().dismiss()`, since that would invoke `dismiss()` on the dialog. Instead, you should use the `dismiss()` method of the DialogFragment itself:

public void dismiss()

Dismiss the fragment and its dialog. If the fragment was added to the back stack, all back stack state up to and including this entry will be popped. Otherwise, a new transaction will be committed to remove the fragment.

As you can see, this takes care not only of closing the dialog but also of handling the fragment transactions involved in the process.

You only need to use `onStop` if you explicitly created any resources that require manual cleanup (closing files, closing cursors, etc.). Even then, I would override `onStop` of the DialogFragment rather than `onStop` of the underlying Dialog.

Problem

The docs say this for the `dismiss()` method from the `Dialog` class: Dismiss this dialog, removing it from the screen. This method can be invoked safely from any thread. Note that you should not override this method to do cleanup when the dialog is dismissed, instead implement that in `onStop()`. In my code, all I do is call `getDialog().dismiss()` to dismiss it. But I am not doing anything else or even using `onStop()`. So I am asking exactly how to correctly dismiss a `DialogFragment` to avoid any memory leaks, etc..

Original source