我有一个工具栏和一个导航抽屉。当我启动我的应用程序时,会创建工具栏和导航抽屉。当我单击导航抽屉中的项目时,它会启动新的片段并保留相同的工具栏。当我启动特定片段时,如何将菜单项添加到工具栏中,例如搜索,添加,编辑?我不希望它们在程序的开头,但是动态创建。此外,我如何能够单击这些按钮并让它们启动其他片段。我希望它在一个片段中,与另一个片段中的编辑按钮相比,工具栏中的编辑按钮执行特定的操作。谢谢!
Menu_toolbar:
<?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"
/>
答案 0 :(得分:123)
@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);
}
答案 1 :(得分:29)
这是动态创建菜单的方法: 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);
答案 2 :(得分:15)
最好的方法:
<强> 1。在“活动”中查找工具栏并将其设置为supportActionBar。
Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
<强> 2。然后,在同一个Activity上处理不同片段的选项菜单将是一块蛋糕。 根据需要在每个片段中执行以下操作:
在OnCreateView方法调用中
setHasOptionsMenu(true);
最后,
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
super.onCreateOptionsMenu(menu, inflater);
}
要管理菜单项,请点击,我们有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);
}
}
答案 3 :(得分:7)
在每个片段中覆盖onCreateOptionsMenu
方法。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.your_menu_xml, menu);
super.onCreateOptionsMenu(menu, inflater);
}
答案 4 :(得分: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);
}
答案 5 :(得分:3)
最简单的选择是做
toolbar.inflateMenu(R.menu.fragment_menu);
答案 6 :(得分:2)
我遇到了同样的问题,我想根据显示的片段替换工具栏菜单。
我现在面临的问题是菜单已添加到上一个菜单中。
为了只显示片段的菜单,我建议:
@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);
}
希望它能提供帮助。
答案 7 :(得分: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)
}
答案 8 :(得分:0)
在XML内部添加此行
app:menu="@menu/main_menu"
答案 9 :(得分: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
}
答案 10 :(得分:0)
这是一种方法:
在您的菜单中添加一个“组”:
<?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>
然后,添加一个
Menu menu;
为您的活动设置变量并将其设置在您对 onCreateOptionsMenu 的覆盖中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
// inflate your menu here
}
之后,当您想显示/隐藏菜单时,将此功能添加到您的活动中并使用:
public void showOverflowMenu(boolean showMenu){
if(menu == null)
return;
menu.setGroupVisible(R.id.main_menu_group, showMenu);
}
这里没有人提到这种方法,所以就在这里。当每个片段没有很多项目并且具有相同的父活动时,这是一种更好的方法。 它取自this answer。