Whats the proper way to handle the selected state of the navigation drawer after back press?
I have a navigation drawer with n entries (in a listview) like the SDK sample in Android Studio. When i click on the navigation drawer entries i want them to be added to the back stack, so i can move back to them.
In onNavigationDrawerItemSelected(int pos) i have
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (position == 0) {
transaction.replace(R.id.container, new FragmentA());
} else if (position == 1) {
transaction.replace(R.id.container, new FragmentB());
} else {
transaction.replace(R.id.container, new FragmentC());
}
transaction.addToBackStack(null);
transaction.commit();
When i click on the second entry in the drawer, B gets selected and replaces A. If i click the back button afterwards, Fragment A is shown again like it should, but B is still selected in the navigation drawer.
How can i get the selection status of the drawer updated after pressing back?
Somehow i need a call to mDrawerListView.setItemChecked(position, true); or NavigationDrawerFragment.selectItem(int position). But to which position? How do i remeber it?
Intercept with onBackPressed?
@Override
public void onBackPressed() {}
But how do i know which fragment is active again? And to which position it corresponds.
Is there some easy solution i am blind to see? It seems that using back in combination with the navigation drawer and updating the selection status is a standard pattern.
This pattern is described in the Implement Back Navigation for Fragments section of the "Proper Back Navigation" documentation.
If your application updates other user interface elements to reflect the current state of your fragments, such as the action bar, remember to update the UI when you commit the transaction. You should update your user interface after the back stack changes in addition to when you commit the transaction. You can listen for when a
FragmentTransaction
is reverted by setting up aFragmentManager.OnBackStackChangedListener
:
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
// Update your UI here.
}
});
That would be the proper place to refresh the current option in the navigation drawer.