我已经在onCreateView中放置了setHasOptionsMenu(true),但我仍然不能在片段中调用onCreateOptionsMenu。

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


试试这个,

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

最后,在onCreateView方法中,添加这一行以使选项出现在工具栏中

setHasOptionsMenu(true);

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

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

在Fragment调用的onCreateView()方法中:

setHasOptionsMenu(true); 

并添加这2个方法:

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

最后,添加新文件res/menu/fragment_menu.xml,定义action_1和action_2。

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

res/menu/fragment_menu.xml中的Action_1 res/menu/fragment_menu.xml中的Action_2 res/menu/menu.xml中的Action_settings


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

在我的活动中添加setSupportActionBar(工具栏),像这样:

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

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

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


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

调用

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

设置setHasMenuOptions(true)工作,如果应用程序有一个主题与动作栏,如theme . materialcomponents . daynight . darkactionbar或Activity有它自己的工具栏,否则oncreateoptionmenufragment不会被调用。

如果你想使用独立的工具栏,你要么需要获得活动,并将工具栏设置为支持操作栏

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

它让你的fragment onCreateOptionsMenu被调用。

其他的选择是,你可以用Toolbar . inflatemmenu (r.m menu. your_menu)和项目监听器来膨胀你的工具栏自己的菜单

toolbar.setOnMenuItemClickListener {
   // do something
   true
}

你可以很容易地做到, 在Create方法的fragment中,

setHasOptionsMenu(true)

现在你可以重写,

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)
    menu.clear()
}