片段未接收菜单回调

aro*_*ero 40 android fragment android-fragments

我有一个片段类扩展Fragment并调用setHasOptionsMenu参与菜单.这个类也实现了onCreateOptionsMenu,onPrepareOptionsMenuonOptionsItemSelected.

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        ....
}
Run Code Online (Sandbox Code Playgroud)

我正在使用FragmentTransaction我的Activity(扩展FragmentActivity)动态加载这个片段.

但是没有调用任何菜单回调(onCreateOptionsMenu,onPrepareOptionsMenuonOptionsItemSelected)(我在这些方法中调试了一些断点)并且未显示菜单.

我错过了什么吗?我需要在我的活动中添加一些内容吗?

我正在使用Android兼容性库,使用L11 SDK进行编译并在Xoom中进行测试.

编辑:我发现了问题.我的AndroidManifest目标是L11,这似乎隐藏了菜单按钮并阻止调用回调.但是,如果我从清单中删除它,我会丢失一些我需要的其他功能(例如列表中的激活状态).有没有人知道如何解决这个问题(启用菜单按钮)而不targetSdkVersion=11从清单中删除?

小智 29

Aromero,不要忘记使用方法的片段版本覆盖onCreateOptionsMenu,类似于:

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

顺便说一句,这会在片段中进行,并添加到Activity的膨胀菜单中(如果有的话).我自己也有同样的问题,直到我弄明白了.

  • 您还需要确保调用setHasOptionsMenu(true); 在你的onCreate或onCreateView上 (12认同)
  • 这不适用于带有viewpager的片段内的嵌套片段! (5认同)

Cat*_*row 9

如果你在使用ActionBarSherlock时遇到这个问题,你需要确保你的片段是SherlockFragments,而不仅仅是支持片段,你要覆盖的是

public void onPrepareOptionsMenu (com.actionbarsherlock.view.Menu menu) {
Run Code Online (Sandbox Code Playgroud)

public void onPrepareOptionsMenu (android.view.Menu menu) {
Run Code Online (Sandbox Code Playgroud)

如果你做了后者,你应该得到关于函数是最终的某种警告,你无法覆盖它.这是一个警告,你试图覆盖错误的功能!

如果通过将类从SherlockFragment切换到仅仅片段来修复错误,则可以创建该函数...但它不会被调用.


Mar*_* HC 9

我有同样的问题,但我认为最好总结并介绍最后一步让它工作:

  1. 在Fragment的onCreate(Bundle savedInstanceState)方法中添加setHasOptionsMenu(true)方法.

  2. onCreateOptionsMenu(Menu menu, MenuInflater inflater)在片段中覆盖(如果你想在Fragment的菜单中做一些不同的事情)和onOptionsItemSelected(MenuItem item)方法.

  3. onOptionsItemSelected(MenuItem item)Activity的方法中,确保在onOptionsItemSelected(MenuItem item)Fragment的方法中实现菜单项操作时返回false .

一个例子:

活动

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Do Activity menu item stuff here
        return true;
    case R.id.fragment_menu_item:
        // Not implemented here
        return false;
    default:
        break;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

分段

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    ....
}

@Override
public void onCreateOptionsMenu(Menu menu) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Not implemented here
        return false;
    case R.id.fragment_menu_item:
        // Do Fragment menu item stuff here
        return true;
    default:
        break;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助.

干杯.


Err*_*454 6

如果您有一个活动和一个片段,每个加载菜单项,那么您需要特别注意您使用的覆盖.

活动可以覆盖onOptionsItemSelectedonMenuItemSelected,但片段只能覆盖onOptionsItemSelected.

如果覆盖活动中的onMenuItemSelected和片段中的onOptionsItemSelected,则永远不会触发片段覆盖.

相反,在activity和fragment中使用onOptionsItemSelected.


Nel*_*rez 5

您需要确保在片段中调用setHasOptionsMenu(true); onCreateonCreateView调用.

您还需要onCreateOptionsMenu在片段内实现覆盖.


aro*_*ero 2

我已经找到问题了。AndroidManifest 针对的是 SDK 11,这似乎隐藏了菜单按钮并阻止调用回调。我认为这破坏了菜单按钮的兼容性,菜单按钮似乎被 Android 3.0 中的操作栏取代