片段在同一布局上具有相同菜单会导致重复的菜单项。

13

我有一个布局包含两个片段,这些片段使用相同的菜单。因为我有另外一个仅包含其中一个片段的布局(用于小屏设备)。

我的问题是每个片段的菜单项都显示在菜单中,由于它们来自相同的菜单,它们会彼此重复。我需要只显示一个片段的菜单,而非全部。有没有办法实现这个目标?

或者,更好的做法可能是创建两个不同的菜单。一个用于仅包含其中一个片段的布局(用于小屏幕设备),另一个用于同时具有两个片段的布局。我该如何实现这个?

编辑:我使用ActionBarSherlock库进行向后兼容测试,并在Android 3.0模拟器上测试过。

4个回答

24

我找到了一个不太好的解决方案。在每个片段的onCreateOptionsMenu()中,调用menu.clear()来删除任何现有的菜单项,然后再填充菜单。

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

}

这将导致未来的问题。我可能会决定为每个片段使用不同的菜单,而这些菜单共享菜单项。我认为我们可以在onCreateOptionsMenu()中操作菜单,但目前我不知道如何在使用MenuInflater填充它之前获取与该片段相关联的菜单项。


你有没有找到解决办法?我目前也遇到了这个问题。 - Kris B
在FragmentActivity的onPrepareOptionsMenu方法中出现了NullPointerException异常。请提供建议。 - Umesh

2
我晚了,但或许这可以帮到其他人。这听起来像是一个设计上的问题(如果这个术语存在的话)。
如果两个片段具有相同的菜单项,并且使用哪个片段的菜单项并不重要(也就是说,如果您点击片段A的项目1或片段B的项目1没有区别),那么菜单可能不应该是片段的一部分,而应该是活动的一部分。这将解决重复的问题。

问题在于当配置更改时也会发生重复,与ActionBar进行更详细的交互将非常有帮助...这不仅仅是设计问题。 - dcow
是的,一个常见的场景是删除操作必须同时出现在主列表的长按菜单和项目的详细信息屏幕上。操作栏的菜单项应该只由详细片段填充,而长按菜单项只有在长按时才显示。 - Monstieur

0

你是否调用了createOptionMenu的super方法?

  • 如果是这样,所有的选项菜单都会被显示出来。

是的,super的createOptionMenu被调用了。 - mr_tawan
不要调用super方法 :) - alosdev
4
我认为这样做会加剧问题,;-) - mr_tawan

0

我找到了一种解决方法,对我有效。在onOptionsItemSelected方法中,首先我检查它是否等于由fragmentManager使用findFragmentById(R.id.content_frame).getClass()获取的类。

我得到了类似这样的东西

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {        
        if( this.class !=  getFragmentManager().findFragmentById(R.id.content_frame).getClass() ) {
            return false; //  must do nothing
        }
        // do your menu stuff
    }

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