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

Android 相同布局上具有相同菜单的片段会导致重复的菜单项,android,android-layout,android-fragments,android-menu,Android,Android Layout,Android Fragments,Android Menu,我有一个布局,其中有2个片段。这些片段使用相同的菜单,因为我有另一个布局,其中只有一个(用于小屏幕设备) 我的问题是菜单中显示的每个片段的菜单项,因为它们来自同一个菜单,所以它们相互复制。我只需要显示一个片段的菜单,而不是两个片段。我能把这个存档吗 或者,最好创建两个不同的菜单。一个用于仅包含其中一个片段的布局(用于小屏幕设备),另一个用于包含两个片段的布局。我怎么能这样做 编辑:我使用ActionBarSherlock库实现向后兼容性,并在Android 3.0模拟器上进行测试。您是否调用cr

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

我的问题是菜单中显示的每个片段的菜单项,因为它们来自同一个菜单,所以它们相互复制。我只需要显示一个片段的菜单,而不是两个片段。我能把这个存档吗

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


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

您是否调用createOptionMenu的超级方法

  • 然后可能会显示所有选项菜单

    • 我找到了不太好的解决方案。在每个片段的onCreateOptions菜单()中,调用menu.clear()删除所有现有菜单项,然后再对菜单进行充气

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

      这将揭示未来的问题。我可能会决定对每个片段使用不同的菜单,每个菜单共享菜单项。我想我们可以在onCreateOptionsMenu()上操作菜单,但目前我不知道如何在使用MenuInflater充气之前获取与碎片关联的菜单项。

      我迟到了,但也许它可以帮助其他人。这听起来像是设计的味道(如果这个术语存在的话)


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

      我找到了一个解决办法,它对我有效。在onOptionsItemSelected方法中,首先我检查该类是否等于使用findFragmentById(R.id.content\u 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
          }
      

      是的,调用了super的createOpionMenu。然后不要调用super方法:)我认为这会使问题恶化;-)你有没有想出解决这个问题的办法?我目前也遇到了这个问题。FragmentActivity的OnPrepareOptions功能表上的nullpointerexception。请注意,当配置发生更改时,也会出现重复问题,与ActionBar进行更详细的交互将非常有帮助。。这不仅仅是设计气味的问题。是的,一个常见的场景是删除操作,它必须出现在主列表上的长按菜单和项目的详细信息屏幕上。操作栏的菜单项应仅由细节片段填充,而长按菜单项仅在长按时显示。