在某些片段中隐藏 MenuItem

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

我尝试添加覆盖 onCreateOptionsMenu()Fragment,我不想显示这个菜单项,但我不能让它工作。我尝试用多种方式查看代码中的注释行。知道问题出在哪里吗?最后这个菜单项去隐藏当我激活菜单抽屉时,被称为 onPrepareOptionsMenu()在主要活动,但我需要做到这一点,当我在 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);
}
}

主要活动定义菜单抽屉:

 //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);
}
74470 次浏览

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

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

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

ActivityFragment可以各自有自己的菜单。

我使用下面的代码将菜单项隐藏在我不想使用的片段中。 注意: 请阅读评论

@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 onPrepareOptionsMenu(Menu menu) {
MenuItem item=menu.findItem(R.id.action_search);
if(item!=null)
item.setVisible(false);
}

以及片段的 onCreate ()

 setHasOptionsMenu(true);

请尝尝这个

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

把这个放到你的片段文件 onCreate ()上

setHasOptionsMenu(true);

在片段类

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

类似的解决方案有很多不同的版本,但不幸的是,没有一个适合我。我分享什么最终是有用的,我隐藏整个溢出菜单与多个菜单项。也许对谁都有用。

我用 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);

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

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

或者在创建菜单的同一个片段中解决它,如果你在活动级别上托管了操作栏。这样你就不必在其他不想展示的片段中添加它:

public override void OnDestroy()
{
base.OnDestroy();
HasOptionsMenu = false;
}

使用 findItem查找要隐藏的项目,然后将其可见性设置为 false

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.action_settings);
item.setVisible(false);
}

将这些函数添加到片段中

  @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem item=menu.findItem(R.id.delete);
item.setVisible(false);
}

首先,在有工具栏的 Activity中,创建一个方法来设置 overflow menu:

public void setUpOptionMenu(Toolbar toolbar){
this.setSupportActionBar(toolbar);
}

在片段 onCreateView()方法中,获取当前活动的引用并调用活动 setUpOptionMenu()方法:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
...
...
public void ((YourActivityName)this.getActivity()).setUpOptionMenu(null);
...
...
}

干杯! ! !

调用 onCreateView()中的 setHasOptionMenu(true)

而片段的 onCreateOptionMenu()中的 别打电话 super.onCreateOptionsMenu()则调用 menu.clear(),因为这将用活动菜单覆盖现有菜单

这招对我很管用。

在 Kotlin

override fun onPrepareOptionsMenu(menu: Menu) {
val item: MenuItem = menu.findItem(R.id.action_search)
item.isVisible = false
}

在片段的 onCreate ()中 SetHasOptionsMenu (true)

在 Kotlin 为有需要的人服务

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.clear()
}

只在片段中重写下面的方法,它就可以完成这个任务。

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
// Do something that differs the Activity's menu here
getActivity().getMenuInflater().inflate(R.menu.drawer, menu);
}

KOTLIN 街2022号

在你的活动中,你可以导航到片段,你可以试试如下,在下面的代码中,在侧面导航视图中测试,它已经显示在任何需要的地方,使用 toolbar.flateMenu (R.menu.toolbar _ menu)和隐藏使用 toolbar.menu.clear ()在工具栏引用。

binding.naviSideNav.setNavigationItemSelectedListener(NavigationView.OnNavigationItemSelectedListener {
when (it.itemId) {
R.id.side_nav_home->{
toolbar.title=""
toolbar.menu.clear()
toolbar.inflateMenu(R.menu.toolbar_menu)
toolbar.setBackgroundColor(ContextCompat.getColor(this,R.color.home_screen_bg))
navController.navigate(R.id.navigation_home)
}
R.id.side_nav_appointments->{


}
R.id.side_nav_ehr->{


}
R.id.side_nav_invoices->{


}
R.id.side_nav_settings->{
toolbar.title=getString(R.string.nav_menu_Settings)
toolbar.menu.clear()
toolbar.setBackgroundColor(ContextCompat.getColor(this,R.color.home_screen_bg))
navController.navigate(R.id.navigation_settings)
}
R.id.side_nav_logout->{


}
}


binding.dlt.closeDrawer(GravityCompat.START)
true
})

清理和重新绘制菜单项

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
menu.clear()
inflater.inflate(R.menu.main_menu, menu)
menu.findItem(R.id.id_menu_search)?.isVisible = true
super.onCreateOptionsMenu(menu, inflater)
}