201

我已经放置setHasOptionsMenu(true)inside onCreateView,但我仍然无法调用onCreateOptionsMenuinside 片段。

@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)必须重写或实现超类型方法。

4

7 回答 7

541

尝试这个,

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

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

setHasOptionsMenu(true);
于 2013-03-27T07:54:35.677 回答
23

您已经拥有定义action_settings的自动生成文件res/menu/menu.xml

在您的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
}

onCreateView()Fragment 调用的方法中:

setHasOptionsMenu(true); 

并添加这两种方法:

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

最后,添加定义action_1action_2的新文件res/menu/fragment_menu.xml

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

  • 来自res/menu/fragment_menu.xml的action_1
  • 来自res/menu/fragment_menu.xml的action_2
  • 来自res/menu/menu.xml的action_settings
于 2015-07-11T17:50:37.810 回答
14

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

在我的 Activity 中添加 setSupportActionBar(toolbar),如下所示:

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

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

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

于 2016-05-27T00:18:22.060 回答
5

称呼

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);
}
于 2017-12-13T08:26:34.327 回答
3

设置 setHasMenuOptions(true) 如果应用程序有一个带有 Actionbar 的主题,例如Theme.MaterialComponents.DayNight.DarkActionBar或者Activity有它自己的 Toolbar,则onCreateOptionsMenu在 Fragment 中不会被调用。

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

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

这让你的片段 onCreateOptionsMenu 被调用。

另一种选择是,您可以使用和项目侦听器来扩展您Toolbar自己的菜单toolbar.inflateMenu(R.menu.YOUR_MENU)

toolbar.setOnMenuItemClickListener {
   // do something
   true
}
于 2020-09-10T18:01:40.567 回答
1
 @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);
}
于 2017-07-19T09:03:04.333 回答
0

您可以轻松地在 Create 方法的片段中执行此操作,

setHasOptionsMenu(true)

现在你可以覆盖,

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)
    menu.clear()
}
于 2021-12-02T12:52:16.360 回答