onCreateOptionsMenu 永远不会被调用(工具栏膨胀)
Posted
技术标签:
【中文标题】onCreateOptionsMenu 永远不会被调用(工具栏膨胀)【英文标题】:onCreateOptionsMenu is never called (toolbar inflate) 【发布时间】:2021-06-21 16:22:16 【问题描述】:我的片段类:
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
所有的点都不起作用。我错过了什么。我需要检查其他内容吗?
【问题讨论】:
【参考方案1】:根据解释如何使用 Fragment 拥有的工具栏的 Fragment-owned app bar guide,您不要使用任何 setHasOptionsMenu()
、onCreateOptionsMenu()
或 onOptionsItemSelected()
API - 这些是仅用于活动拥有的应用栏。
相反,您可以使用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;
);
【讨论】:
对不起,回答迟了,最好有一个片段拥有的应用栏或活动拥有的应用栏(就像 homerman 建议的答案) 我链接到的页面专门对此进行了说明。如果您的应用栏应该在您的活动中无处不在可用,那么将其归活动所有是有意义的。如果它从一个片段变为另一个片段或在某些屏幕上不存在,它应该是片段的一部分。【参考方案2】:在主机Activity
中设置工具栏。然后在必要时覆盖每个Fragment
中的菜单处理。
这里有一些通用脚手架(使用 cmets):
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);
【讨论】:
以上是关于onCreateOptionsMenu 永远不会被调用(工具栏膨胀)的主要内容,如果未能解决你的问题,请参考以下文章
onCreateOptionsMenu 没有在 Fragment 内被调用
onCreateOptionsMenu()没有在FragmentActivity上调用
IOS:UITextInput 上的 Tokenizer 永远不会被调用