在活动和片段中在工具栏上显示不同的菜单选项

8
Android Studio 1.4

我有一个工具栏,我在我的activity_main.xml中填充它。 我有一个名为main.xml的菜单,只有一个图标显示在上面。
当用户点击打开片段时,我有另一个名为friends.xml的菜单,其中有两个图标。
当我在片段中填充好友菜单时,它仍然显示来自main.xml菜单的图标。
我以为在工具栏上填充新菜单会删除现有菜单。
这是main.xml菜单的截图。查找图标被显示 enter image description here 这是片段的截图,您可以看到搜索图标仍然存在。 enter image description here 包括工具栏的activity_main.xml
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            android:id="@+id/tbMain"
            layout="@layout/app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true"/>
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

这是我在MainActivity.java中创建菜单的代码:

    private void setupToolBar() {
        mToolbar = (Toolbar)findViewById(R.id.tbMain);
        setSupportActionBar(mToolbar);

        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

在我的代码片段中,可以看到我正在加载friends.xml菜单。

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

非常感谢任何建议,


我曾认为在工具栏上充气一个新菜单会删除现有的菜单,但这是无效的。总菜单项数=Activity的菜单项数+Fragment的菜单项数。 - QAMAR
只需将以下代码:@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); }移动到 FirstFragment 中,并在 FirstFragment 的 onCreate() 方法中添加 setHasOptionsMenu(true)。这样应该就可以了。 - PunitD
不需要在活动内部填充菜单...只需要按片段处理即可。 - PunitD
2个回答

15

我不确定你是否可以使用onCreateOptionsMenu()来实现这个功能。我认为更好的方法是使用onPrepareOptionsMenu()

你可以通过在Fragment的onResume()中简单地编写getActivity().invalidateOptionsMenu()来强制刷新Android选项菜单。

因此,你的onPrepareOptionsMenu()将如下所示:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menu.clear();    //remove all items
    getActivity().getMenuInflater().inflate(R.menu.menu_fragment, menu);
}

这是我解决它的方式,因为它看起来非常干净。像魔法一样奏效。谢谢。 - ant2009
你是否知道如何在不同的Fragment中为工具栏图标应用不同的颜色?例如,我想让Fragment_1的图标是白色的,而Fragment_2的图标是黑色的。 - AndroidDevBro
@AndroidDevBro 我认为你需要从你的片段中更改工具栏主题,从像 onResume() 这样的生命周期方法开始。 - Sufian
@Sufian 感谢您的回复。不过,您能否再具体一些呢?这段代码应该放在 XFragment 方法中、onCreateView 方法中还是仅仅放在 Fragment 类的根目录下? - AndroidDevBro
我认为在 onResume() 中执行会更合适。 - Sufian

3

menu引用存储在一个变量中。

 private Menu menu;

       @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.main, menu);
            this.menu = menu;
            return super.onCreateOptionsMenu(menu);
        }

替换到所提及的片段时,请执行以下操作。
private void hideOption(int id) {
        menu.findItem(id).setVisible(false);
    }

调用hideOption()函数并传入菜单ID。例如:
hideOption(R.id.action_search);

相反,显示也是如此。或者遵循 #Droidwala 的建议。

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