How to hide OptionsMenu on NavigationDrawer using Fragments?

android, android-fragments, android-optionsmenu, navigation-drawer

Solution

I faced the same problem using the boilerplate code generated by Android Studio and got it working by modifying the menu in `NavigationDrawerFragment.onPrepareOptionsMenu()` (in my case, I wanted to clear the menu altogether):

@Override
public void onPrepareOptionsMenu(Menu menu) {
    if (mDrawerLayout != null && isDrawerOpen()) {
        menu.clear();
    }
}

This is roughly how the options menu is recreated:

- `NavigationDrawerFragment`, which is generated by the IDE, calls `supportInvalidateOptionsMenu()` when the drawer is opened or closed.

- `onCreateOptionsMenu` gets called: The hosting activity and each of the added fragments gets a chance to contribute menu items.

- `onPrepareOptionsMenu` gets called: Again, the hosting activity and each of the added fragments get a chance to modify the menu.

The fragments are iterated in the order they were added. There is no way to stop the chain of calls midway in steps 2. and 3.

So the idea is to let `NavigationDrawerFragment` do last-minute changes to the menu in its `onPrepareOptionsMenu` and no other fragments.

If you need to let other fragments do something in `onPrepareOptionsMenu`, then you may have to setup those other fragments so they can determine if the drawer is open or not and change their behavior accordingly. This may mean perhaps adding a `isDrawerOpen` method to the hosting activity or passing in the drawer identifiers to the fragment like it's done in `NavigationDrawerFragment.setup()`.

Problem

I am creating android application and I'm trying to respect as much as possible the latest Android usability standards. In particular, I am preparing the user interface using the navigation drawer, and I'm trying to ensure compatibility with 2.1+ Android versions. To appreciate the problem, the project consists of: - A main activity; - A navigation drawer; - Four fragments (with their associated layouts). The problem I'm experiencing occurs when opening the navigation drawer: although each `Fragment` has its specific menu, when I open the navigation drawer it is added to the nav drawer menu. I tried in several ways (`invalidateOptionMenu()`, `menu.clear()`, manipulating functions `isDrawerOpen()` and `isDrawerClose()` and more), but I cannot remove the `Fragment`'s menu when opening the navigationdrawer. These are some snippets of my code, much of it generated by Android Studio, the IDE I'm using: In main activity: ``` @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.global, menu); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); } ``` where "global" is a simple menu with a classical "ic_action_overflow". And in my fragments I've: ``` @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.fragment1, menu); } ``` (It's the same of the other `Fragment`s). Someone can give me some advice on how to act?

Original source

Related problems