16

I use Fragments and when I switch to nested Fragment, which implements public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) my menu inflates quantity of times when I get to that nested Fragment. How can I avoid this? I also implement constructor of Fragment with methods:

setRetainInstance(true);
setHasOptionsMenu(true);

When I tried to implement siple solution as:

 @Override
 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     // TODO Add your menu entries here
   if(!isInflated)
         {
         inflater.inflate(R.menu.contacts_archive_menu, menu);
         isInflated = true;
         }
         super.onCreateOptionsMenu(menu, inflater);

 }

but my menu wasn't inflate after the screen rotation.

Rikki Tikki Tavi
  • 3,089
  • 5
  • 43
  • 81

4 Answers4

40

I solved it simply by clearing menu before ionflating of it:

     @Override
     public void   onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
          menu.clear();
          inflater.inflate(R.menu.call_menu, menu);
          super.onCreateOptionsMenu(menu, inflater);

     }
Rikki Tikki Tavi
  • 3,089
  • 5
  • 43
  • 81
8

Just check the count of menu items. Meaning menu.size()==0 ,no menu items are present,then inflate with layout menu,else don't inflate at all.

 @Override
 public void   onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
      if (menu.size() == 0)
      inflater.inflate(R.menu.call_menu, menu);
      super.onCreateOptionsMenu(menu, inflater);

 }
laaptu
  • 2,963
  • 5
  • 30
  • 49
  • 1
    Great.. its best way instead of menu.clear() because in that case menu inflated all time. – Pranav Apr 06 '16 at 05:48
0

Just override the invalidateOptionsMenu, example:

private var isMenuCreated = false

...

override fun invalidateOptionsMenu() {
  Log.d("invalidateOptionsMenu")
  if (!isMenuCreated) {
    super.invalidateOptionsMenu()
  }
}

...

override fun onCreateOptionsMenu(menu: Menu): Boolean {
  ...
  isMenuCreated = true
  return true
}
drakeet
  • 2,685
  • 1
  • 23
  • 30
-1

Use before replace.

 fragment = new EditMyProfile();
 FragmentTransaction fragmentTransactionEditProfile =getSupportFragmentManager().beginTransaction();
 getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
 fragmentTransactionEditProfile.replace(R.id.frame, fragment);
 fragmentTransactionEditProfile.commit();
Manohar
  • 22,116
  • 9
  • 108
  • 144
shubomb
  • 672
  • 7
  • 20