13

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

我的问题是菜单中显示的每个片段的菜单项,并且由于它们来自同一个菜单,因此它们彼此重复。我只需要显示一个片段中的菜单,而不是两者。反正我可以存档吗?

或者,可能更好,创建 2 个不同的菜单。一个用于仅具有其中一个片段的布局(用于小屏幕设备),另一个用于具有两个片段的布局。我怎么能这样做?

编辑:我使用 ActionBarSherlock 库来实现向后兼容性,并在 Android 3.0 模拟器上对其进行了测试。

4

4 回答 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 对其进行充气之前获取与片段关联的菜单项。

于 2011-12-13T20:25:34.140 回答
2

我迟到了,但也许它可以帮助别人。这听起来像是一种设计气味(如果存在这个术语)。

如果两个 Fragment 有相同的菜单项,并且使用哪个 Fragment 的项无关紧要(即单击 Fragment A 的 item 1 或 Fragment B 的 item 1 没有区别),那么菜单可能不应该是片段的一部分,而是活动的一部分。这将解决重复。

于 2012-09-09T20:44:46.467 回答
0

你会调用createOptionMenu的超级方法吗?

  • 然后可能会显示所有选项菜单。
于 2011-12-12T10:25:35.893 回答
0

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

我有这样的东西

    @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
    }
于 2016-09-28T18:35:50.177 回答