在一些碎片中隐藏MenuItem

我使用菜单抽屉有更多的Fragment 。 在一些Fragment我有菜单项REFRESH,但在一些片段中,我想隐藏这个菜单项(我不想显示菜单,但我不想隐藏ActionBar )。

我尝试添加覆盖onCreateOptionsMenu() Fragment ,我不想显示这个菜单项,但我不能让它工作。 我尝试很多方式在代码中看到注释行。 有什么想法在哪里是问题? 最后,当我在MainActivity中调用onPrepareOptionsMenu()时,激活菜单抽屉时,此菜单项将隐藏,但当我在Fragment时,需要执行此操作。

我想隐藏的Fragment菜单项刷新:

  public class FindPeopleFragment extends Fragment { public FindPeopleFragment(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_find_people, container, false); //setHasOptionsMenu(false); return rootView; } private Menu menu=null; @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main, menu); this.menu=menu; menu.findItem(R.id.refresh).setVisible(false); getActivity().invalidateOptionsMenu(); //setHasOptionsMenu(false); super.onCreateOptionsMenu(menu,inflater); } } 

MainActivity在哪里定义MENU DRAWER:

  //Slide menu item click listener private class SlideMenuClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // display view for selected nav drawer item displayView(position); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // toggle nav drawer on selecting action bar app icon/title if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } switch (item.getItemId()) { case R.id.refresh: Toast.makeText(this, "Refreshing data...", Toast.LENGTH_SHORT).show(); return true; } return super.onOptionsItemSelected(item); } // Called when invalidateOptionsMenu() is triggered @Override public boolean onPrepareOptionsMenu(Menu menu) { // if nav drawer is opened, hide the action items boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); menu.findItem(R.id.refresh).setVisible(!drawerOpen); return super.onPrepareOptionsMenu(menu); } 

Solutions Collecting From Web of "在一些碎片中隐藏MenuItem"

在你不想显示任何菜单选项的Fragment中,你需要setHasOptionsMenu(false);onCreate() ,像这样:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(false); } 

但是,正在显示的菜单是您想要隐藏的(REFRESH),属于MainActivity。 这就是为什么总是显示。 既然你想控制Fragment级别的菜单(而不是显示一个Activity选项菜单),我的build议是从Activity删除菜单代码,并在你的Fragment实现它。

ActivityFragment可以分别具有自己的菜单。 看到这个链接 。

在你想要隐藏物品的片段中

 @Override public void onPrepareOptionsMenu(Menu menu) { MenuItem item=menu.findItem(R.id.action_search); item.setVisible(false); 

并在你的片段的onCreate()

  setHasOptionsMenu(true); 

请试试这个

 @Override public void onPrepareOptionsMenu(Menu menu) { menu.clear(); } 

并把它放在你的碎片上onCreate()

 setHasOptionsMenu(true); 

我只是使用下面的代码隐藏在fragmnet menuitem我不想使用它。 注意:请阅读评论

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); Fragment whichFragment=getVisibleFragment();//getVisible method return current visible fragment String shareVisible=whichFragment.getClass().toString(); if(shareVisible.equals(AccFragment.class.toString()) ||shareVisible.equals(SocFragment.class.toString()) ||shareVisible.equals(DevFragment.class.toString()) ){ MenuItem item=menu.findItem(R.id.action_share); item.setVisible(false); } return super.onCreateOptionsMenu(menu); } 

在片段类

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.clear(); } 

有许多类似的解决scheme的不同版本,但不幸的是,他们都没有为我工作。 我分享了最终对我隐藏整个溢出菜单的多个菜单项。 想想也许这对任何人都有用。

我用一个id分组我的菜单,然后引用该id

 @Override public void onPrepareOptionsMenu(Menu menu) { menu.setGroupVisible(R.id.menu_overflow, false); super.onPrepareOptionsMenu(menu); } 

如果你想隐藏任何单独的菜单项,那么你可以使用

 menu.getItem(R.id.action_licenses).setVisible(false); 

重要的是,你应该在onViewCreated()onViewCreated() setOptionsMenu(true) onViewCreated()

 @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setHasOptionsMenu(true);