为不同的片段添加菜单项

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

菜单 _ 工具栏:

<?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"
/>
90287 次浏览

Override onCreateOptionsMenu method in your every fragment.

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

This is how to create menu dynamically: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Edited:

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

Add similar code to your fragments:

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

This way you can customize the menu for your fragments.

I solved this issues correctly. My solution is as following code:

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

I had the same issue and I wanted to replace the toolbar menu accordingly to the fragment displayed.

The problem I'm now facing is that the menu is added to the previous one.

In order to show only the menu for the fragment, I suggest:

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

Hope it'll help.

The best way to do it :

1. Find toolbar in Activity and set it as supportActionBar.

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. Then It will be a piece of cake to handle option menus for different fragments over a same Activity. Do following things in each fragment as you want:

In OnCreateView Method call

setHasOptionsMenu(true);

And Lastly,

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

And to manage menu items click, we have onOptionsItemSelected:

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

Below are the steps to show different menu options with different fragments.

Step1: Call setHasOptionsMenu(true)

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


}

Step2: Inflate your fragment related option menu items.

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

The simplest option is to do

toolbar.inflateMenu(R.menu.fragment_menu);

and for handle click on menu item

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

Inside XML add this line

app:menu="@menu/main_menu"

Using new MaterialToolbar it's very easy to create an overflow menu and use to:

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

and then in code to set OnCLick Listeners just add this:

toolbar.setOnMenuItemClickListener {
// .. DO SOMETHING HERE
false
}

This is one way of doing this:

add a "group" to your menu:

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


<group
android:id="@+id/main_menu_group">
<item android:id="@+id/done_item"
android:title="..."
android:icon="..."
android:showAsAction="..."/>
</group>
</menu>

then, add a

Menu menu;

variable to your activity and set it in your override of onCreateOptionsMenu:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
// inflate your menu here
}

After, add and use this function to your activity when you'd like to show/hide the menu:

public void showOverflowMenu(boolean showMenu){
if(menu == null)
return;
menu.setGroupVisible(R.id.main_menu_group, showMenu);
}

No one mentioned this method here so here it is. This is a better approach when you don't have many items for each fragment and have the same parent activity. It's taken from this answer.

i had the same problem, what worked for me was this: in my case i have 1 toolbar in the main activity and all fragments will use that toolbar by just adding new menu items to the toolbar

  1. set the support action bar in the main activity oncreate method

    MaterialToolbar maintoolbar=findViewById(R.id.topAppBar); setSupportActionBar(maintoolbar);

  2. add this in fragment oncreateview

    setHasOptionsMenu(true);

  3. override the oncreateoptionsmenu method in your fragment

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

  4. handle options menu clicks in your fragment

    @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case ...: break; default: return super.onOptionsItemSelected(item); } ... }