如何使用Fragments在NavigationDrawer上隐藏OptionsMenu?

我正在创buildAndroid应用程序,并且尽可能地尊重最新的Android可用性标准。 特别是,我正在准备使用导航抽屉的用户界面,我试图确保与2.1以上的Android版本的兼容性。 为了解这个问题,该项目包括:

  • 主要活动
  • 导航抽屉;
  • 四个片段(与他们相关的布局)。

当我打开导航抽屉时,出现了我遇到的问题:虽然每个Fragment都有其特定的菜单,但是当我打开导航抽屉时,它将被添加到导航抽屉菜单中。 我尝试了几种方法( invalidateOptionMenu()menu.clear() ,操作函数isDrawerOpen()isDrawerClose()等等),但是当我打开navigationdrawer的时候无法删除Fragment的菜单。

这些是我的代码片段,大部分是由Android Studio,我使用的IDE生成的:

主要活动:

 @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.global, menu); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); } 

其中“全球”是一个简单的菜单与经典的“ic_action_overflow”。

在我的片段中,我已经:

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

(这与其他Fragment是一样的)。

有人可以给我一些build议如何行事?

我遇到了同样的问题,使用Android Studio生成的样板代码,并通过修改NavigationDrawerFragment.onPrepareOptionsMenu()的菜单(在我的情况下,我想完全清除菜单):

 @Override public void onPrepareOptionsMenu(Menu menu) { if (mDrawerLayout != null && isDrawerOpen()) { menu.clear(); } } 

这大致是如何重新创build选项菜单:

  1. 由IDE生成的NavigationDrawerFragment在抽屉打开或closures时调用supportInvalidateOptionsMenu()
  2. onCreateOptionsMenu被调用 :托pipe活动和每个添加的片段都有机会贡献菜单项。
  3. onPrepareOptionsMenu被调用 :同样,托pipe活动和每个添加的片段都有机会修改菜单。

这些片段按照它们添加的顺序迭代 。 步骤2和步骤3中途没有办法阻止电话连锁。

所以这个想法是让NavigationDrawerFragmentonPrepareOptionsMenu的菜单进行最后一刻的更改,而不是其他片段。

如果您需要让其他片段在onPrepareOptionsMenu执行某些onPrepareOptionsMenu ,则可能需要设置其他片段,以便确定抽屉是否打开并相应地更改其行为。 这可能意味着可能在宿主活动中添加一个isDrawerOpen方法,或者像在NavigationDrawerFragment.setup()那样将抽屉标识符传递给片段。

在你的片段onCreate,添加这个:

 setHasOptionsMenu (true); 

然后通过onPrepareOptionsMenu隐藏。 例如

 @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.action_settings).setVisible(false); } 

如果您已经按照Android Studio使用NavigationDrawerFragment示例代码为您设置了导航抽屉,则应该有两个xml以main.xml (活动范围的操作栏菜单项)和global.xml (全局项目)。 然后,我添加了一个片段特定的菜单,只要抽屉closures,就可以将项目添加到“活动菜单项目”中。

活动:

 @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this activity // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.main, menu); this.menu = menu; restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); } 

NavigationDrawerFragment

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // If the drawer is open, show the global app actions in the action bar. // See also showGlobalContextActionBar, which controls the top-left area // of the action bar. if (mDrawerLayout != null && isDrawerOpen()) { inflater.inflate(R.menu.global, menu); showGlobalContextActionBar(); } super.onCreateOptionsMenu(menu, inflater); } 

并在你的片段添加,如上所述

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Add fragment specific action bar items to activity action bar items. // Activity wide items are in main.xml // Visible action bar items if navigation drawer is visible/open // are in global.xml super.onCreateOptionsMenu(menu, inflater); if (!mNavigationDrawerFragment.isDrawerOpen()) { inflater.inflate(R.menu.fragment_menu, menu); } } 

看看这个答案在这里: https : //stackoverflow.com/a/18135409/2558344 。 它基本上使用布尔值来清除导航抽屉中的项目,反之亦然。 但是,也可以将Menu menu声明为私有variables,并将其用作: onCreateOptionsMenu(menu, MenuInflater inflater)

然后检查你的片段onStop()onPause()是否显示项目,如果是的话清除它们,如:

 if (menu != null) menu.clear();