在Fragment的onCreateOptionsMenu中,菜单膨胀调用多次的问题。

16

我使用Fragment,当我切换到嵌套的Fragment时,它实现了public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)方法,当我进入该嵌套的Fragment时,我的菜单会被充气多次。我该如何避免这种情况?我还实现了带有方法的Fragment构造函数:


setRetainInstance(true);
setHasOptionsMenu(true);
当我尝试实现简单的解决方案时:

 @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);

 }

但是在屏幕旋转后,我的菜单没有被充气。

4个回答

40

我通过在充气之前清除菜单来简单解决了它:

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

     }

6
这是什么虫子?有任何想法吗? - Zeeshan
谢谢。我们有一个片段数组,用于填充菜单。 - Abdulmoiz Esmail

8

只需检查menu项的计数。 如果menu.size()==0,即没有menu项存在,则填充layout menu,否则不执行任何填充操作。

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

 }

1
太好了,这是最好的方法,而不是使用menu.clear(),因为在那种情况下,菜单会一直膨胀。 - Pranav

0

只需覆盖invalidateOptionsMenu,例如:

private var isMenuCreated = false

...

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

...

override fun onCreateOptionsMenu(menu: Menu): Boolean {
  ...
  isMenuCreated = true
  return true
}

-1

替换前先使用。

 fragment = new EditMyProfile();
 FragmentTransaction fragmentTransactionEditProfile =getSupportFragmentManager().beginTransaction();
 getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
 fragmentTransactionEditProfile.replace(R.id.frame, fragment);
 fragmentTransactionEditProfile.commit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接