I am going over the official Android tutorial for DialogFragments. The part that slightly confuses me is:
void showDialog() {
mStackLevel++;
// DialogFragment.show() will take care of adding the fragment
// in a transaction. We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
newFragment.show(ft, "dialog");
}
So my confusion arises from the fact that they are using findFragmentByTag("dialog")
. Nowhere is a layout XML declared that has a tag named dialog
in it. In case of normal Fragmants, there are <fragment ../>
tags in the layout so I can retrieve fragments with Id or tagname. Here, there isn't any.
So, what gives ? How does this work ?
Also, what if I have multiple DialogFragments
? findFragmentByTag("dialog");
will return what??
:)
Fragments can be attached to an Activity in two ways: statically by declaring it in the layout xml using the <fragment>
tag; or programmatically using FragmentManager
and FragmentTransaction
. In the case of DialogFragments, you will always be using the latter.
When you attach a fragment to the Activity, such as by using DialogFragment.show()
, you can give it a tag. The FragmentManager
can then later find this fragment by its tag. In this case, the code is checking if the FragmentManager
already has a fragment with this tag (which I believe would be the case if the dialog was already showing when showDialog()
was called). If so, it removes the fragment (dismissing the dialog) before showing a new instance of it.