2011-12-12 56 views
12

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

我的问题是每个片段的菜单项显示在菜单中,并且由于它们来自相同的菜单,所以它们被相互复制。我只需要显示一个片段的菜单,而不是两个。无论如何,我可以将它归档吗?

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

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

回答

0

你叫做createOptionMenu的超级方法吗?

  • 那么它可能会发生所有选项菜单显示。
+0

是的,超级的createOpionMenu被调用。 –

+0

然后不要叫超级方法:) – alosdev

+4

那么会恶化的问题,我认为;-) –

21

我发现不太好的解决方案。在每个片段的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对其进行膨胀之前获取与片段相关的菜单项。

+0

你有没有想出一个解决方案呢?我目前也遇到了这个问题。 –

+0

这....为我工作..呵呵.... –

+0

nullpointerexception在onPrepareOptionsMenu的FragmentActivity.Please通知 – Umesh

2

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

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

+0

问题是重复也发生在配置改变,并与ActionBar更详细的交互将是超级有用..这不仅仅是一个设计气味问题。 – dcow

+0

是的,常见的情况是删除操作,它必须出现在主列表的长按菜单和项目的详细信息屏幕上。操作栏的菜单项只应由细节片段填充,而长按菜单项仅在长按时显示。 – Monstieur

0

我发现了一个解决方法,它为我工作。在onOptionsItemSelected方法,首先,我做了检查,如果它的类等于或不I类从findFragmentById(R.id.content_frame)的fragmentManager得到.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 
    } 
相关问题