我已将setHasOptionsMenu(true)
放在onCreateView
内,但我仍然无法在片段内调用onCreateOptionsMenu
。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
return inflater.inflate(R.layout.facesheet, container, false);
}
以下是我的onCreateOptionsMenu
代码。
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
getSupportMenuInflater().inflate(R.menu.layout, menu);
return (super.onCreateOptionsMenu(menu));
}
我得到的错误消息:
Fragment类型的方法
onCreateOptionsMenu(Menu)
必须覆盖或实现超类型方法。
答案 0 :(得分:434)
试试这个,
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_sample, menu);
super.onCreateOptionsMenu(menu,inflater);
}
在onCreate
中添加此行,以使选项显示在Toolbar
setHasOptionsMenu(true);
答案 1 :(得分:20)
您已经拥有自动生成的文件 res / menu / menu.xml ,用于定义 action_settings 。
在 MainActivity.java 中,有以下方法:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_settings:
// do stuff, like showing settings fragment
return true;
}
return super.onOptionsItemSelected(item); // important line
}
在片段调用的onCreateView()
方法中:
setHasOptionsMenu(true);
并添加以下两种方法:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_1:
// do stuff
return true;
case R.id.action_2:
// do more stuff
return true;
}
return false;
}
最后,添加新文件 res / menu / fragment_menu.xml ,定义 action_1 和 action_2 。
这样,当您的应用显示片段时,其菜单将包含3个条目:
答案 2 :(得分:9)
我尝试了@Alexander Farber和@Sino Raj的答案。这两个答案都很好,但是我无法在我的片段中使用onCreateOptionsMenu,直到我发现缺少的内容:
在我的Activity中添加setSupportActionBar(工具栏),如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.id.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
我希望这个答案可以帮助有同样问题的人。
答案 3 :(得分:2)
致电
setSupportActionBar(toolbar)
内
onViewCreated(...)
片段的
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
((MainActivity)getActivity()).setSupportActionBar(toolbar);
setHasOptionsMenu(true);
}
答案 4 :(得分:2)
如果应用程序的主题带有诸如Theme.MaterialComponents.DayNight.DarkActionBar
或Activity
这样的带有操作栏的主题,则set setHasMenuOptions(true)可以工作,否则片段中的onCreateOptionsMenu
不会被调用。
如果您想使用独立的Toolbar
,则需要进行活动并将Toolbar
设置为支持操作栏,
(requireActivity() as? MainActivity)?.setSupportActionBar(toolbar)
这将使您的片段onCreateOptionsMenu被调用。
另一种选择是,您可以使用Toolbar
来填充toolbar.inflateMenu(R.menu.YOUR_MENU)
自己的菜单,并使用
toolbar.setOnMenuItemClickListener {
// do something
true
}
答案 5 :(得分:1)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_add_customer, container, false);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_sample, menu);
super.onCreateOptionsMenu(menu,inflater);
}