Handling ActionBar title with the fragment back stack? Handling ActionBar title with the fragment back stack? android android

Handling ActionBar title with the fragment back stack?


In every fragment and every activity I change the title like this. This way the active title will always be correct:

@Overridepublic void onResume() {    super.onResume();    // Set title    getActivity().getActionBar()        .setTitle(R.string.thetitle);}

There is some cases where onResume isn't called inside fragments. In some of these cases we can use:

public void setUserVisibleHint(boolean isVisibleToUser) {    super.setUserVisibleHint(isVisibleToUser);    if(isVisibleToUser) {        // Set title        getActivity().getActionBar()            .setTitle(R.string.thetitle);    }}


As the original answer is quite old, this might come of help as well. As the documentation states, one might want to register a listener to listen on the back stack changes in the hosting Activity:

getSupportFragmentManager().addOnBackStackChangedListener(        new FragmentManager.OnBackStackChangedListener() {            public void onBackStackChanged() {                // Update your UI here.            }        });

Then, identify the situation in the callback method and set a proper title, without accessing the ActionBar from the Fragment.

This is a more elegant solution as the Fragment doesn't have to know about the ActionBar existence and Activity is usually the place that is managing the backstack so having it handled over there seems to be more appropriate. Fragment should at all time be considered only by its own content, not the surroundings.

More on the topic in the documentation.


Let the controlling activity do all the work as follows:

Listen for backstack events (in onCreate() of activity):

// Change the title back when the fragment is changed    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {        @Override        public void onBackStackChanged() {            Fragment fragment = getFragment();            setTitleFromFragment(fragment);        }    });

Get the current fragment from the container:

/** * Returns the currently displayed fragment. * @return *      Fragment or null. */private Fragment getFragment() {    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container);    return fragment;}

Set the fragment inside the content view:

private void setFragment(Fragment fragment, boolean addToBackStack) {    // Set the activity title    setTitleFromFragment(fragment);    .    .    .}