android-fragments 如何在片段中使用与Activity中不同的菜单?

jmo0nnb3  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(213)

我希望有一个主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>

我如何获得我想要的菜单(不使用search操作,使用add_friend操作)?我意识到,从Activity中管理这个操作可能更简单,并且只在显示片段时膨胀特定的片段菜单,就像Activity中的注解所说的那样:// Depending on which fragment is used display different actions.

stszievb

stszievb1#

如果你想保持这样的结构,你可以尝试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);
}
ztigrdn8

ztigrdn82#

对我有效的方法
在你的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);
}

相关问题