片段内的onCreateOptionsMenu


182

我已放置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));
}

我收到的错误消息:

该方法onCreateOptionsMenu(Menu)类型片段的必须重写或实现的超类型方法。


1
感谢“ setHasOptionsMenu(true);”,我一直在寻找那个。
Fabricio PH 2014年

Answers:


497

试试这个,

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

onCreate添加此行以使选项出现在您的Toolbar

setHasOptionsMenu(true);

182
如果您不添加以下行,它将不会被调用:setHasOptionsMenu(true);
Yoann Hercouet 2013年

10
片段的onCreateOptionsMenu()与活动具有不同的参数。
豪尔赫2013年

3
还有一个不同的返回类型为void,与活动中的onCreateOptionsMenu()的布尔值不同,如上所述。
德克斯特(Dexter)2014年

4
有趣的注意:如果您还覆盖包含的“活动”中的onCreateOptionsMenu,则将显示两个选项菜单项。
亚当·约翰斯

5
setHasOptionsMenu(true);必须被调用onCreate()才能完成。
Roel

21

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

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

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

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

1
问题是碎片内部,而不是活动
OlivierM 2016年

2
@OlivierM答案确实解释了片段菜单。我很欣赏它如何与活动菜单交互的解释。
阿兰达

13

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

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

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


4

呼叫

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

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.