Uses of fragment tags

For Non-UI Fragments:

Why would I need to set a tag for a Fragment?

Sometimes the Fragment can be used as a background worker by the Activity. Such fragment doesn't have UI, it is also called non-UI fragment. The String tag is the only way to identify this fragment. To add this fragment, you use add(Fragment, String) method which doesn't take View Id. For example:

FragmentManager fm = getFragmentManager();
workFragment.setTargetFragment(this, 0);
fm.beginTransaction().add(workFragment, "work").commit();

Then later, to get the reference to this fragment use,

workFragment = (WorkFragment)fm.findFragmentByTag("work");

Now using the workFragment reference you can access all the methods of this fragment in the Activity or it's UI fragment. Here's the complete example of a non-UI fragment.


For Fragments with UI:

And is it good practice if a Fragment changed its behaviour based on its tag?

There are situations where we have to change the fragment's behaviour from Activity using tags. It should be alright to do so, I've seen some open source apps using this practice. Basically you supply string tags to fragments. This is used for tagging a fragment within the FragmentManager so we can easily look it up later. And change or access it's behaviour from the Activity.

For example: A user switches to SettingsActivity from MainActivity, changes the setting, presses back button to come back to MainActivity. You can detect the setting change in MainActivity#onResume() and update or change the behaviour of the current fragment according to the new setting.

FragmentManager fm = getFragmentManager();
uiFragment = (UiFragment) fm.findFragmentByTag("ui");
uiFragment.fetchNewData();
uiFragment.displayNewData();

Fragment tags can be used to avoid recreating a Fragment on Activity orientation change.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.photos_image_pager);

    MyFragment fragment;
    if (savedInstanceState != null) {
        fragment = (MyFragment) getFragmentManager()
            .findFragmentByTag("my_fragment_tag");
    } else {
        fragment = new MyFragment();
        fragment.setArguments(getIntent().getExtras());
        getFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, fragment, "my_fragment_tag")
            .commit(); 
    }
}

The Activity is recreated on orientation change, and its onCreate(...) method is called. If the Fragment was created before the Activity was destroyed and was added to the FragmentManager with a tag, it can now be retrieved from the FragmentManager by the same tag.

For a longer discussion on how it can be used, see:

  • ViewPager and fragments - what's the right way to store fragment's state?