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

use*_*400 10 android android-fragments android-optionsmenu navigation-drawer

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

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

打开导航抽屉时遇到的问题是:虽然每个Fragment都有其特定菜单,但当我打开导航抽屉时,它会被添加到导航抽屉菜单中.我尝试了几种方式(invalidateOptionMenu(),menu.clear()操作函数isDrawerOpen()isDrawerClose()),但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);
}
Run Code Online (Sandbox Code Playgroud)

其中"global"是一个带有经典"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);
}
Run Code Online (Sandbox Code Playgroud)

(这与其他人Fragment的情况相同).

有人可以就如何采取行动给我一些建议吗?

ent*_*nto 12

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

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

这大致是重新创建选项菜单的方式:

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

片段按添加顺序迭代.在步骤2和3中途无法阻止呼叫链.

因此,我们的想法是让NavigationDrawerFragment菜单的最后一刻更改,onPrepareOptionsMenu而不是其他片段.

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


use*_*518 5

在你的片段onCreate中,添加:

setHasOptionsMenu (true);
Run Code Online (Sandbox Code Playgroud)

然后通过onPrepareOptionsMenu隐藏.例如

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


Aas*_*hir 0

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

然后检查您的fragments onStop()onPause()是否显示项目,如果是,则清除它们,例如:

if (menu != null)
    menu.clear();
Run Code Online (Sandbox Code Playgroud)