片段中的onCreateOptionsMenu

Kev*_*vin 166 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);
}
Run Code Online (Sandbox Code Playgroud)

以下是我的onCreateOptionsMenu代码.

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误消息:

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

Sin*_*Raj 458

试试这个,

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

onCreate添加此行以使选项显示在您的Toolbar

setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

  • 如果你不添加这一行,它将不会被调用:`setHasOptionsMenu(true);` (171认同)
  • 片段的onCreateOptionsMenu()具有与活动不同的参数. (9认同)
  • `setHasOptionsMenu(true);`必须在`onCreate()`中调用`才能完成. (5认同)
  • 有趣的说明:如果您还在包含的Activity中覆盖onCreateOptionsMenu,则将显示两个选项菜单项. (4认同)
  • 还有一个不同的返回类型为void,与上面提到的活动中onCreateOptionsMenu()的布尔值不同. (3认同)

Ale*_*ber 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
}
Run Code Online (Sandbox Code Playgroud)

onCreateView()Fragment调用的方法中:

setHasOptionsMenu(true); 
Run Code Online (Sandbox Code Playgroud)

并添加以下两种方法:

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • ACTION_1RES /菜单/ fragment_menu.xml
  • 来自res/menu/fragment_menu.xml的action_2
  • 来自res/menu/menu.xml的action_settings

  • @OlivierM的答案确实解释了片段菜单.我很欣赏它与活动菜单交互的解释. (2认同)

Fil*_*ito 10

我尝试了@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);
}
Run Code Online (Sandbox Code Playgroud)

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


Cha*_*anh 6

称呼

setSupportActionBar(toolbar)
Run Code Online (Sandbox Code Playgroud)

里面

onViewCreated(...) 
Run Code Online (Sandbox Code Playgroud)

片段数

@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);
}
Run Code Online (Sandbox Code Playgroud)