我正在尝试从一组片段中将一个项目添加到选项菜单。
我创建了一个新的MenuFragment
类,并将其扩展为希望包含菜单项的片段。这是代码:
public class MenuFragment extends Fragment {
MenuItem fav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
由于某些原因,onCreateOptionsMenu
似乎无法运行。
调用超级方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Add your menu entries here
super.onCreateOptionsMenu(menu, inflater);
}
在代码中添加日志语句,以查看是否未调用该方法或代码未修改菜单。
还请确保您正在调用setHasOptionsMenu(boolean)
中的onCreate(Bundle)
来通知片段应参与选项菜单处理。
我遇到了同样的问题,我的片段是ViewPager的页面。发生这种情况的原因是,我在实例化FragmentPagerAdapter时使用的是子片段管理器,而不是活动支持片段管理器。
菜单文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/play"
android:titleCondensed="Speak"
android:showAsAction="always"
android:title="Speak"
android:icon="@drawable/ic_play">
</item>
<item
android:id="@+id/pause"
android:titleCondensed="Stop"
android:title="Stop"
android:showAsAction="always"
android:icon="@drawable/ic_pause">
</item>
</menu>
您的代码很好。方法中只缺少超级:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO add your menu :
inflater.inflate(R.menu.my_menu, menu);
//TODO call super
super.onCreateOptionsMenu(menu, inflater);
}
我发疯了,因为这里没有答案对我有用。
要显示我必须呼叫的菜单:
创建片段视图后设置选项菜单对我来说效果很好。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
我的问题略有不同。我做的一切都正确。但是我为承载该片段的活动继承了错误的类。
因此请注意,如果您要覆盖片段中的onCreateOptionsMenu(Menu menu, MenuInflater inflater)
,请确保承载此片段的活动类继承android.support.v7.app.ActionBarActivity
(以防您想支持低于API级别11的情况。
我想补充一件事,以及它对我不起作用的原因。
类似于Napster的答案。
在菜单文件夹中,创建一个.menu xml文件并添加此xml
如果以上所有方法均无效,则需要调试并确保已调用onCreateOptionsMenu函数(通过放置调试或写入日志...)
如果未运行,则可能是您的Android主题不支持操作栏。打开AndroidManifest.xml并通过主题支持操作栏设置android:theme
的值
在您的[[onCreate方法上,添加setHasOptionMenu()
我有同样的问题,但我认为最好总结一下并介绍使之正常工作的最后一步:
在Fragment的onCreate(Bundle savedInstanceState)
方法中添加setHasOptionsMenu(true)方法。
覆盖onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(如果要在Fragment的菜单中进行其他操作)和Fragment中的onOptionsItemSelected(MenuItem item)
方法。
在onOptionsItemSelected(MenuItem item)
Activity方法中,请确保在onOptionsItemSelected(MenuItem item)
Fragment方法中实现菜单项操作时返回false。
示例:
活动] >>
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Do Activity menu item stuff here return true; case R.id.fragment_menu_item: // Not implemented here return false; default: break; } return false; }
片段
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
....
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Do something that differs the Activity's menu here
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.activity_menu_item:
// Not implemented here
return false;
case R.id.fragment_menu_item:
// Do Fragment menu item stuff here
return true;
default:
break;
}
return false;
}
如果发现未调用onCreateOptionsMenu(Menu menu, MenuInflater inflater)
方法,请确保从Fragment的onCreate(Bundle savedInstanceState)
方法中调用以下代码:
如果需要menu
来刷新特定webview
内部的Fragment
,则可以使用:
在menu.xml
中,您应该添加所有菜单项。然后,您可以隐藏不想在初始加载中看到的项目。
在展开菜单之前,您需要使用menu.clear()。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
就我而言,这是步骤。
如果要添加菜单自定义项
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_custom, menu);
}