问题描述
我的片段类:
Toolbar toolbar;
@Override
public void onViewCreated(View view,@Nullable Bundle savedInstanceState) {
toolbar = getView().findViewById(R.id.toolbar3);
toolbar.inflateMenu(R.menu.menufragmentmain);
setHasOptionsMenu(true); //i also tried putting this function in oncreate function
}
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
Toast.makeText(getActivity(),"i never enter this function also",Toast.LENGTH_LONG).show();
super.onCreateOptionsMenu(menu,inflater);
inflater.inflate(R.menu.menufragmentmain,menu);
}
@Override
public boolean onoptionsItemSelected(MenuItem item) {
Toast.makeText(getActivity(),"i never enter this function",Toast.LENGTH_LONG).show();
//some switch cases.....
return super.onoptionsItemSelected(item);
}
我有一个愚蠢的错误,我无法无情地找到。我的片段有一个简单的工具栏。在 onViewCreated
中,我用我的工具栏扩充了我的操作栏菜单。
问题是函数 onCreateOptionsMenu
和 'onoptionsItemSelected' 从未被调用。我不知道为什么。
我在其他类似问题中检查过的问题:
- 我检查了我的主要活动是否有
onCreateOptionsMenu
或'onoptionsItemSelected'。它不会*t - 检查我的样式类是否没有:
android:theme="@android:style/Theme.Black.NoTitleBar
这些要点都不起作用。我错过了什么。我需要检查其他东西吗?
解决方法
根据解释如何使用 Fragment 拥有的工具栏的 Fragment-owned app bar guide,您不要使用任何 setHasOptionsMenu()
、onCreateOptionsMenu()
或 { {1}} 个 API - 仅用于 Activity 拥有的应用栏。
相反,您可以使用 onOptionsItemSelected()
API 来遵循 guide for handling menu click events:
Toolbar
,
在主机 Activity
中设置工具栏。然后在必要时覆盖每个 Fragment
中的菜单处理。
这是一些通用的脚手架(带注释):
public class MyFragment extends Fragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Report that this Fragment has an options menu
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu,@NonNull MenuInflater inflater) {
// Inflate then menu,and THEN call super()
// Note the order of the invocations
inflater.inflate(R.menu.my_menu,menu);
super.onCreateOptionsMenu(menu,inflater);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
// Handle menu item selections
final int itemId = item.getItemId();
switch(itemId) {
case R.id.my_menu_option_x: ...; return true;
case R.id.my_menu_option_y: ...; return true;
case R.id.my_menu_option_z: ...; return true;
default: return super.onOptionsItemSelected(item);
}
}
}