onCreateOptionsMenu 永远不会被调用(工具栏膨胀)
onCreateOptionsMenu is never called (toolbar inflate)
我的片段class:
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'。我不知道为什么。
我在其他类似问题中检查过的相同问题:
- 我检查了我的主要 activity 是否有
onCreateOptionsMenu
或 'onOptionsItemSelected'。它没有*t
- 检查我的风格 class 是否没有:
android:theme="@android:style/Theme.Black.NoTitleBar
None 的要点毫无意义地工作。我错过了什么。我还需要检查其他东西吗?
根据解释如何使用片段拥有的工具栏的 Fragment-owned app bar guide,您不要使用任何 setHasOptionsMenu()
、onCreateOptionsMenu()
,或 onOptionsItemSelected()
API - 这些仅用于 activity 个拥有的应用程序栏。
相反,您可以使用 Toolbar
API 遵循 guide for handling menu click events:
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
toolbar = getView().findViewById(R.id.toolbar3);
toolbar.inflateMenu(R.menu.menufragmentmain);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(getActivity(), "onMenuItemClick called" , Toast.LENGTH_LONG).show();
//some switch cases.....
return true;
}
});
}
在主机中设置工具栏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);
}
}
}
我的片段class:
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'。我不知道为什么。
我在其他类似问题中检查过的相同问题:
- 我检查了我的主要 activity 是否有
onCreateOptionsMenu
或 'onOptionsItemSelected'。它没有*t - 检查我的风格 class 是否没有:
android:theme="@android:style/Theme.Black.NoTitleBar
None 的要点毫无意义地工作。我错过了什么。我还需要检查其他东西吗?
根据解释如何使用片段拥有的工具栏的 Fragment-owned app bar guide,您不要使用任何 setHasOptionsMenu()
、onCreateOptionsMenu()
,或 onOptionsItemSelected()
API - 这些仅用于 activity 个拥有的应用程序栏。
相反,您可以使用 Toolbar
API 遵循 guide for handling menu click events:
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
toolbar = getView().findViewById(R.id.toolbar3);
toolbar.inflateMenu(R.menu.menufragmentmain);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(getActivity(), "onMenuItemClick called" , Toast.LENGTH_LONG).show();
//some switch cases.....
return true;
}
});
}
在主机中设置工具栏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);
}
}
}