Android工具栏为不同片段添加菜单项

Android工具栏为不同片段添加菜单项,android,android-fragments,android-toolbar,Android,Android Fragments,Android Toolbar,我有一个工具栏和一个导航抽屉。启动应用程序时,会创建工具栏和导航抽屉。当我单击导航抽屉中的项目时,它会启动新的片段并保持相同的工具栏。当我启动特定片段时,如何向工具栏添加菜单项,如搜索、添加、编辑?我不希望在程序开始时使用它们,而是动态创建它们。另外,我如何才能单击这些按钮并让它们启动其他片段。我希望在一个片段中,与另一个片段中的编辑按钮相比,工具栏中的编辑按钮可以做特定的事情。谢谢 菜单和工具栏: <?xml version="1.0" encoding="utf-8"?> <

我有一个工具栏和一个导航抽屉。启动应用程序时,会创建工具栏和导航抽屉。当我单击导航抽屉中的项目时,它会启动新的片段并保持相同的工具栏。当我启动特定片段时,如何向工具栏添加菜单项,如搜索、添加、编辑?我不希望在程序开始时使用它们,而是动态创建它们。另外,我如何才能单击这些按钮并让它们启动其他片段。我希望在一个片段中,与另一个片段中的编辑按钮相比,工具栏中的编辑按钮可以做特定的事情。谢谢

菜单和工具栏:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

工具栏:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>

覆盖每个片段中的onCreateOptions菜单方法

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

以下是如何动态创建菜单:

编辑:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);

向片段中添加类似的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.library_fragment, parent, false);
    setHasOptionsMenu(true);
    return v;
}


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

通过这种方式,您可以自定义片段的菜单。

我正确地解决了这个问题。我的解决方案如下代码所示:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

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

我也有同样的问题,我想根据显示的片段替换工具栏菜单

我现在面临的问题是菜单被添加到了上一个菜单中

为了只显示片段的菜单,我建议:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

希望能有所帮助。

最好的方法是:

1。在“活动”中查找工具栏并将其设置为supportActionBar。

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
2。那么,在同一个活动中处理不同片段的选项菜单将是小菜一碟。 在每个片段中根据需要执行以下操作:

在OnCreateView方法调用中

setHasOptionsMenu(true);
最后

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
要管理菜单项,请单击,我们选择了OnOptions Item:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}

下面是使用不同片段显示不同菜单选项的步骤

步骤1:呼叫设置选项菜单(true)

步骤2:膨胀碎片相关选项菜单项

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

最简单的选择是

toolbar.inflateMenu(R.menu.fragment_menu);
对于句柄,单击菜单项

toolbar.setOnMenuItemClickListener {
    when (it.itemId) {
        R.id.nav_example -> doThat()
    }
    true
}

在XML中添加这一行

app:menu="@menu/main_menu"
使用“新建”可以很容易地创建溢出菜单并用于:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

@JoeEigi你为什么想要不同的工具栏?您可以设置不同的标题和菜单。@JoeEigi是的,您可以通过扩展自定义菜单xml来设置自定义菜单。调用
setTitle()
可以添加标题。@JoeEigi似乎您的上下文搞错了,看看这个:我在清单中关闭了actionbar,但仍然显示在工具栏上方的活动布局中。如何消除此问题是的,这样做了,但仍显示在我的布局中,但被移出视图这是正确的答案,因为在片段中调用OnCreateOptions菜单方法需要调用SetHasOptions菜单(true)。还记得调用
菜单.clear()吗
onCreateOptions菜单中
-否则您也将从父菜单继承菜单。@我将代码放在哪里清除?片段或活动,先生,我在片段中没有看到menuitem。这对API级别28有效吗?我仍然可以看到主活动菜单项我正确地显示了菜单。但是如何在片段关闭时隐藏此菜单,我的意思是当我们切换到另一个片段时,例如从a->b,片段b的工具栏中仍然可以看到a的菜单。在片段b的onCreateView中使用setHasOptions菜单(false)。使用
actionBarToolbar.setOnMenuItemClickListener()
来处理菜单项操作
OnOptions ItemSelected()
在这种情况下不会被调用。给定的链接不再存在,只需检查菜单是否!=在调用.clear()之前为null这有助于我删除新菜单上出现的不需要的菜单按钮SoptionsMenu(true)非常有用!谢谢你,你说得对!您可以通过xml指定它,然后在片段中:```覆盖有趣的onViewCreated(view:view,savedInstanceState:Bundle?{super.onViewCreated(view,savedInstanceState)toolBar.setNavigationOnClickListener{activity?.onBackPressed()}searchView=toolBar.menu.findItem(R.id.action\u search).actionView作为SearchView SearchView.setOnQueryTextListener(this)}``单击Listener可获得如下菜单:
<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>
toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }