【问题标题】:Show different menu options on Toolbar for activity and fragment在工具栏上为活动和片段显示不同的菜单选项
【发布时间】:2015-10-06 19:19:18
【问题描述】:
Android Studio 1.4

我在activity_main.xml 中有一个工具栏。 我有一个名为 main.xml 的菜单,它会膨胀,只显示 1 个图标。

当用户点击打开一个片段时。我还有另一个菜单 friends.xml,它有 2 个图标。

当我在片段中膨胀朋友菜单时,它仍然显示来自main.xml 菜单的图标。

我认为在工具栏上扩展一个新菜单会删除现有菜单。

这是 main.xml 菜单的屏幕截图。显示查找图标

这是片段的屏幕截图,您可以看到查找图标仍然存在。

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);
    }

非常感谢您的任何建议,

【问题讨论】:

  • “我认为在工具栏上增加一个新菜单会删除现有菜单”这是无效的,总菜单项 = MenuItemsOfActivity+MenuItemsOfFragment
  • 只需将 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } 移动到 FirstFragment 中并在 FirstFragment 的 onCreate() 中执行 setHasOptionsMenu(true) .. 这应该可以工作
  • 无需在活动中膨胀菜单..只需按片段进行

标签: android android-toolbar


【解决方案1】:

我不确定您是否可以使用 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);
}

【讨论】:

  • 这是我解决它的方法,因为它看起来很干净。像魅力一样工作。谢谢。
  • 您是否知道如何为单独的片段上的工具栏图标应用不同的颜色?例如。 Fragment_1 我希望图标是白色的,而 Fragment_2 是黑色的
  • @AndroidDevBro 我觉得你必须从片段中更改工具栏主题,从像 onResume() 这样的生命周期方法
  • @Sufian 感谢您的回复。你能说得更具体一点吗?这是在XFragment 方法、onCreateView 方法中还是在Fragment's 类的根中?
  • 我相信在onResume() 这样做会更合适。
【解决方案2】:

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);
    }

使用菜单 ID 致电 hideOption()。例如,

hideOption(R.id.action_search);

反之亦然。或遵循#Droidwala的建议

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多