如何在不同的片段中为工具栏设置不同的菜单?

3

我有一个使用抽屉菜单和滑动标签的项目,是按照这个教程创建的。我使用支持库让Material Design在旧版Android上可用。我还使用了ToolBar代替ActionBar。我在ToolBar上附加了一个菜单:

    toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
    toolbar.inflateMenu(R.menu.menu_main);

我困扰的问题是针对每个片段拥有特定菜单。我尝试了很多其他类似问题的答案,例如这个这个,但都无济于事。大多数人建议实施这些方法,但它们只适用于ActionBar,而在我的情况下,我有一个android.support.v7.widget.Toolbar
我还尝试了使用
toolbar.getMenu().findItem(R.id.menuitem).setVisible(false);
supportInvalidateOptionsMenu();

但它似乎也不起作用。在这种情况下,我的菜单就会消失。

我寻找并努力解决了几周,但没有成功。我做错了什么吗?

如何为每个片段设置特定的菜单?我认为隐藏菜单项可能是实现这一目标更容易的选择,但如果您有其他方法来完成这一点,我将不胜感激。


你在activity中的某个时刻调用了setSupportActionBar(toolbar)吗?你应该这样做,并在onCreateOptionsMenu()方法中填充你的菜单。在那里,你可以处理你的菜单逻辑(无论是通过隐藏还是填充不同的菜单),并且当你在片段之间切换以重新创建它时,如你所说,调用supportInvalidateOptionsMenu()。 - Daniel Ocampo
但是如果我调用setSupportActionBar(toolbar),我的ActionBarDrawerToggle会出现某种问题停止工作。 - Anderson Madeira
除非您提供更多的代码并解释每种情况下发生了什么,否则我认为我们无法帮助您。我认为我所说的似乎是正确的方法,请告诉我们这种方法的确切情况。 - Daniel Ocampo
我理解你的观点,很抱歉没有提供足够的代码。我的代码有点混乱和复杂,无法在这里发布。你是对的,一个简单的调用 setSupportActionBar(toolbar) 就是我所有头疼的源头,我需要调用该方法才能让 这个 起作用。现在每个片段都有自己的菜单,在 onCreateOptionsMenu 中展开。感谢你的帮助,如果你发表一篇解释 setSupportActionBar 的用法的答案,我会很高兴接受它作为正确答案。 - Anderson Madeira
1个回答

2

当您设置工具栏时(可能在onCreate中),应调用setSupportActionBar(toolbar)并像通常一样在onCreateOptionsMenu(Menu menu)方法中填充菜单。

在此方法中,您可以处理不同的菜单,无论是通过隐藏项目还是根据片段充气不同的菜单。

然后,如您所说,当您在片段之间切换以重新创建菜单时,请调用supportInvalidateOptionsMenu();。


1
我曾考虑调用supportInvalidateOptionsMenu(),但是这个答案提供了一种更优雅的方法,即在每个片段的onCreate方法中调用setHasOptionsMenu(true),这样可以节省一些代码行数。 ;) - Anderson Madeira
是的,那也很好用,而且看起来更简洁,我没想到。 - Daniel Ocampo
对我也有用。我发现在支持库和集成API的迷宫中不迷失很困难。 - Vincent Hiribarren
最佳做法是在编码时始终坚持使用支持库。 - Anderson Madeira

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