Android OnCreateOptions菜单内部片段

Android OnCreateOptions菜单内部片段,android,android-fragments,layout-inflater,oncreateoptionsmenu,Android,Android Fragments,Layout Inflater,Oncreateoptionsmenu,我已经将sethaseoptions菜单(true)放在onCreateView内部,但我仍然无法在片段内部调用oncreateoptions菜单 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true);

我已经将
sethaseoptions菜单(true)
放在
onCreateView
内部,但我仍然无法在片段内部调用
oncreateoptions菜单

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}
下面是我的
onCreateOptions菜单
code

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}
我收到的错误消息是:

Fragment类型的方法
onCreateOptions菜单(菜单)
必须重写或实现超类型方法

试试这个

@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定义操作设置

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()
方法中:

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;
}
最后,添加新文件res/menu/fragment\u menu.xml定义action\u 1action\u 2

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

  • 操作1来自res/menu/fragment\u menu.xml
  • 操作2来自res/menu/fragment\u menu.xml
  • 操作设置来自res/menu/menu.xml

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

在“我的活动”中添加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);
}
里面

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);
}
如果应用程序有一个带有Actionbar的主题,例如
theme.MaterialComponents.DayNight.DarkActionBar
Activity
有自己的工具栏,则Set-setHasMenuOptions(true)可以工作,否则片段中的
OnCreateOptions菜单
不会被调用

如果要使用独立的
工具栏
,则需要获取“活动”并将
工具栏
设置为支持操作栏

(requireActivity() as? MainActivity)?.setSupportActionBar(toolbar)
它允许调用您的片段onCreateOptions菜单

另一种选择是,您可以使用
工具栏对
工具栏的菜单进行充气。充气菜单(R.menu.your_菜单)
,并使用

toolbar.setOnMenuItemClickListener {
   // do something
   true
}

如果不添加以下行,则不会调用它:
SethasOptions菜单(true)onCreateOptionsMenu()的参数与活动的参数不同。此外,与上述ans中提到的活动中onCreateOptionsMenu()的布尔值不同,返回类型也是void。有趣的注意:如果在包含活动中也重写了onCreateOptionsMenu,将显示两个选项菜单项。
sethaspoptions菜单(true)onCreate()
中调用code>才能完成。感谢“设置选项菜单(true);”,我在找,问题在碎片里,不是activity@OlivierM答案确实解释了片段菜单。我很欣赏对它如何与活动菜单交互的解释。
toolbar.setOnMenuItemClickListener {
   // do something
   true
}