如何在片段中使用与 activity 中不同的菜单?

How to use different menu in fragment than in activity?

我想要一个主 activity 菜单和一个包含在主 activity 中的片段的菜单。应删除主 activity 菜单,并在片段可见时扩充片段菜单。我试图实现这一点,但这是结果:

主 activity 菜单片段本身:

显示片段时的主 activity 菜单片段:

很明显,我没有替换主菜单 activity 中的菜单,而是添加了它,尽管已经创建并扩充了片段菜单。

这是 activity 中负责此操作的代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    // Depending on which fragment is used display different actions.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

片段中的代码如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
setHasOptionsMenu(true);
}

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

这里是friend_menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
    android:icon="@drawable/ic_person_add_black_24dp"
    android:id="@+id/nav_person_add"
    android:title="Add people"
    app:showAsAction="ifRoom" />

</menu>

如何获得我想要的菜单(没有搜索操作和 add_friend 操作)?我意识到从 activity 管理它可能更简单,并且只在片段显示时膨胀特定的片段菜单,如 activity 中的评论说:// Depending on which fragment is used display different actions.

如果您想保持结构不变,可以尝试 clear() 菜单。

在你的Fragment

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear(); // Remove all existing items from the menu, leaving it empty as if it had just been created.
    inflater.inflate(R.menu.friend_menu, menu);
}

什么对我有用

在你的onCreateView

 public View onCreateView(LayoutInflater inflater,
      ViewGroup container, Bundle savedInstanceState) {

     setHasOptionsMenu(true);
 }

在你的 onCreateOptionsMenu

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.setGroupVisible(0,false);
    inflater.inflate(R.menu.new_menu, menu);

    super.onCreateOptionsMenu(menu, inflater);
}