片段未收到菜单回调

41

我有一个扩展了Fragment类的片段类,并调用setHasOptionsMenu来参与菜单。这个类还实现了onCreateOptionsMenuonPrepareOptionsMenuonOptionsItemSelected

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

我正在使用在Activity中加载Fragment的FragmentTransaction,但是菜单回调(onCreateOptionsMenu, onPrepareOptionsMenuonOptionsItemSelected)没有被调用(我已经通过这些方法设置了一些断点),并且菜单也没有显示。

我错过了什么吗?我需要在我的Activity中添加什么吗?

我正在使用Android兼容库,在L11 SDK下进行编译,并在Xoom上进行测试。

编辑:我已经找到问题所在。我的AndroidManifest文件的目标版本是L11,这似乎隐藏了菜单按钮并阻止了回调函数的调用。然而,如果我从清单中删除targetSdkVersion=11,那么我会失去一些我需要的其他功能(例如列表中的激活状态)。有没有人知道如何解决这个问题(启用菜单按钮)而不必从Manifest中删除targetSdkVersion=11


你能确认你的片段是否真正被加载了吗?例如,在onCreate中是否被调用? - PJL
是的,我可以确认。此外,我已经尝试静态加载它,也就是在活动布局中定义片段,但仍然没有菜单。 - aromero
@PJL 谢谢,我会尝试调试这个库。这个片段确实有一个用户界面,其他一切都正常工作。 - aromero
我找到了问题。我会编辑我的问题。 - aromero
@PJL 你是在使用SDK 11进行编译吗?你是在使用Xoom进行测试吗?在我的情况下,只有移除targetSdkVersion=11才会有所不同。 - aromero
显示剩余5条评论
12个回答

1
如果您的工具栏在父活动xml中定义,请确保在片段中执行此操作。
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ....
    Toolbar toolbar = (Toolbar)getActivity().findViewById(R.id.toolbar);
    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

当然,接下来需要像下面这样覆盖onCreateOptionsMenu函数。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.edit_menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

这是唯一对我有效的解决方案!


1

我曾经遇到过同样的问题,解决方法是:

  1. 移除或注释掉任何 onOptionsItemSelected(), onMenuItemSelected(), 甚至 onPrepareOptionMenu(),只保留在 Activity 中的 onCreateOptionsMenu():

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater=getMenuInflater();
    inflater.inflate(R.layout.menu, menu);
    return true;
    }
    
  2. 在 Fragment 类中,在 onCreateView() 方法中添加:

    setHasOptionsMenu(true);
    
  3. 在 Fragment 类中添加:

    @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     super.onCreateOptionsMenu(menu,inflater);      
     }
    
    @Override
     public boolean onOptionsItemSelected(MenuItem item){           
             switch(item.getItemId()){
             case R.id.action_insert:
                //doing stuff
             return true;
             }
             return false;
         }
    

已在Android 4.4上进行测试并工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接