碎片中的onCreateOptionsMenu

我已经在onCreateView中放置了setHasOptionsMenu(true),但我仍然不能在片段中调用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)必须重写或实现超类型方法。

137116 次浏览

试试这个,

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

最后,在onCreateView方法中,添加这一行以使选项出现在你的Toolbar

setHasOptionsMenu(true);

你已经有了自动生成的文件res /菜单/ 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
}

在Fragment调用的onCreateView()方法中:

setHasOptionsMenu(true);

并添加这2个方法:

@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 /菜单/ fragment_menu.xml,定义action_1action_2

这样,当你的应用程序显示Fragment时,它的菜单将包含3个条目:

  • action_1res /菜单/ fragment_menu.xml
  • action_2res /菜单/ fragment_menu.xml
  • action_settingsres /菜单/ menu。xml

我尝试了@Alexander Farber和@Sino Raj的答案。两个答案都很好,但我不能在我的片段内使用onCreateOptionsMenu,直到我发现什么是缺失的:

在我的活动中添加setSupportActionBar(工具栏),像这样:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.id.activity_main);


Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}

我希望这个答案能对有同样问题的人有所帮助。

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

调用

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

如果应用程序有一个带有动作栏的主题,如Theme.MaterialComponents.DayNight.DarkActionBarActivity有自己的工具栏,则设置setHasMenuOptions(true)有效,否则onCreateOptionsMenu in fragment不会被调用。

如果你想使用独立的Toolbar,你要么需要获得活动,并将你的Toolbar设置为支持操作栏

(requireActivity() as? MainActivity)?.setSupportActionBar(toolbar)

它让你的fragment onCreateOptionsMenu被调用。

另一种方法是,你可以用toolbar.inflateMenu(R.menu.YOUR_MENU)来扩展你的Toolbar自己的菜单,用

toolbar.setOnMenuItemClickListener {
// do something
true
}

你可以很容易地做到, 在Create方法的片段中,

setHasOptionsMenu(true)

现在你可以重写,

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
menu.clear()
}