在片段中更改操作栏菜单

4
我希望在加载片段时能够加载另一个菜单xml。我在主活动中使用了以下代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

我正在片段中使用这段代码:

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

当用户加载碎片时,活动菜单应该被删除,然后碎片菜单应该加载到操作栏中。当用户从片段点击返回按钮时,片段菜单应该被删除,主活动菜单应该加载到操作栏中。
现在,此代码没有删除旧菜单,而是将新菜单添加到旧菜单附近。
我该怎么做呢?

使用 invalidateOptionsMenu() 来实现此功能... - Pragnesh Ghoda シ
我应该把这个放在哪里? - Serkay Sarıman
3个回答

9

你可以使用 menu.clear(); 方法。

它会移除菜单中所有已有的项目,使其变为空白,就像刚创建时一样。

试一下吧..

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
    menu.clear(); // clears all menu items..
    getActivity().getMenuInflater().inflate(R.menu.fragment_menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

现在正在清理,但我还有一个问题。当用户从片段点击返回按钮时,我会运行invalidateOptionsMenu(),但仍然显示片段菜单。 - Serkay Sarıman
如果你想删除旧的菜单项,最好先使用menu.clear()方法。这样做既简单又有用。 - Pragnesh Ghoda シ
你弄错了。我在Activity的onCreateOptionsMenu中加入了clear语句。但是当我尝试从Fragment返回时,仍然在ActionBar中显示Fragment菜单。我认为当我按下返回按钮时,onCreateOptionsMenu没有再次运行。 - Serkay Sarıman
尝试将其放置在onPrepareOptionMenu()中。 - Pragnesh Ghoda シ
https://dev59.com/IWsy5IYBdhLWcg3w2Bk6 - Pragnesh Ghoda シ

3

onCreateView方法中调用setHasOptionsMenu(true);,以告知该片段已有菜单。

然后尝试以下代码...

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        return inflater.inflate(R.layout.fragment_manage, container, false);
    }


@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
    menu.clear(); // clears all menu items..
    inflater.inflate(R.menu.fragment_menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

2

试试这个:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
  inflater.inflate(R.menu.fragment_menu, menu);
  super.onCreateOptionsMenu(menu,inflater);
}

希望能帮到你。

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