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上调用

应用程序崩溃onCreateOptionsMenu(也许)

IOS:UITextInput 上的 Tokenizer 永远不会被调用

菜单项onCreateOptionsMenu()和onOptionsItemSelected()的使用

QAbstractItemModel data() 永远不会被调用