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


89

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

菜单工具栏:

<?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"
/>

Answers:


167

将类似的代码添加到片段中:

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

这样,您可以自定义片段菜单。


19
这是正确的答案,因为在片段中调用onCreateOptionsMenu方法需要调用setHasOptionsMenu(true)。
John Slavick '16

15
请记住有关调用menu.clear()的信息onCreateOptionsMenu-否则,您也将从父级继承菜单。
Dart Dega

@DartDega我在哪里清除代码?片段或活动长官,我没有在片段中看到menuitem
famfamfam

这适用于API级别28吗?我仍然看到主要活动菜单项
ArdenDev

33

这是动态创建菜单的方法:http : //www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

编辑:

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

4
用于actionBarToolbar.setOnMenuItemClickListener()处理菜单项操作。onOptionsItemSelected()在这种情况下不会被呼叫。
Lahiru Chandima

2
给定的链接不再是
Ashvin solanki

25

最好的方法是:

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

为了管理菜单项的单击,我们选择了onOptionsItemSelect:

@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
setHasOptionsMenu(true)真的很有帮助!感谢U
J.Dragon

10

onCreateOptionsMenu在每个片段中覆盖方法。

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

@JoeEigi为什么要使用其他工具栏?您可以设置不同的标题和菜单。
Ellie Zou 2015年

@JoeEigi是的,您可以通过扩展自定义菜单xml获得自定义菜单。通话setTitle()可以添加标题。
Ellie Zou 2015年

@JoeEigi看来你找错人背景下,有这样一看:stackoverflow.com/questions/26998455/...
陈德源

1
我在清单中关闭了操作栏,但仍显示在工具栏上方的活动布局中。我该如何摆脱这种
乔Eigi

是的,这样做了,并且仍然显示在我的布局中,但没有显示出来
Joe Eigi 2015年


4

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

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

是的,我正确显示了菜单。但是如何在片段关闭时隐藏此菜单,我的意思是当我们从a-> b切换到另一个片段时,片段b工具栏中仍然可见的菜单。
Zeeshan Ahmed

在片段b的onCreateView中使用setHasOptionsMenu(false)。
Kannan_SJD

4

我遇到了同样的问题,我想根据显示的片段替换工具栏菜单。

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

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

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

希望能对您有所帮助。


2
只需在调用.clear()之前检查menu!= null是否为null
mapo

2

以下是显示带有不同片段的不同菜单选项的步骤。

步骤1:呼叫setHasOptionsMenu(true)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

步骤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)
}

这有助于我删除出现在新菜单上的多余菜单按钮
Im Batman

1

在XML内添加此行

app:menu="@menu/main_menu"

1
其实你是对的!您可以通过xml进行指定,然后在片段中进行指定:```over fun fun onViewCreated(view:View,savedInstanceState:Bundle?){super.onViewCreated(view,savedInstanceState)toolBar.setNavigationOnClickListener {activity?.onBackPressed()} searchView = toolBar.menu.findItem(R.id.action_search).actionView作为SearchView searchView.setOnQueryTextListener(this)}`
user3193413

0

使用新的MaterialToolbar,很容易创建一个溢出菜单并用于:

<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"/>

然后在代码中设置OnCLick侦听器,只需添加以下内容:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.