片段中的onCreateOptionsMenu

时间:2013-03-27 07:31:08

标签: android android-fragments layout-inflater oncreateoptionsmenu

我已将setHasOptionsMenu(true)放在onCreateView内,但我仍然无法在片段内调用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类型的方法onCreateOptionsMenu(Menu)必须覆盖或实现超类型方法。

6 个答案:

答案 0 :(得分:434)

试试这个,

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

onCreate中添加此行,以使选项显示在Toolbar

setHasOptionsMenu(true);

答案 1 :(得分:20)

您已经拥有自动生成的文件 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
}

在片段调用的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_menu.xml ,定义 action_1 action_2

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

    来自 res / menu / fragment_menu.xml
  • action_1 来自 res / menu / fragment_menu.xml
  • action_2 来自 res / menu / menu.xml
  • action_settings

答案 2 :(得分:9)

我尝试了@Alexander Farber和@Sino Raj的答案。这两个答案都很好,但是我无法在我的片段中使用onCreateOptionsMenu,直到我发现缺少的内容:

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

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

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

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

答案 3 :(得分:2)

致电

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

答案 4 :(得分:2)

如果应用程序的主题带有诸如Theme.MaterialComponents.DayNight.DarkActionBarActivity这样的带有操作栏的主题,则set setHasMenuOptions(true)可以工作,否则片段中的onCreateOptionsMenu不会被调用。

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

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

这将使您的片段onCreateOptionsMenu被调用。

另一种选择是,您可以使用Toolbar来填充toolbar.inflateMenu(R.menu.YOUR_MENU)自己的菜单,并使用

toolbar.setOnMenuItemClickListener {
   // do something
   true
}

答案 5 :(得分: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);
}