Android Sherlock选项菜单项没有响应

Android Sherlock选项菜单项没有响应,android,actionbarsherlock,Android,Actionbarsherlock,这是一个影响3.0之前的平台的问题,即当Sherlock作为代理提供操作栏菜单项时 我有一个片段活动,它包含两个片段,每个片段都有自己的一组选项菜单。当活动启动时,将显示第一个片段选项卡,其菜单项正常工作。但是,第一次切换到其他选项卡时,其菜单项没有响应。如果我切换回第一个选项卡并再次选择另一个选项卡,它们将正常启动 看起来这是一个已知的问题。查看讨论 我现在的解决方法是检测第一次选择第二个选项卡,并通过编程切换回第一个选项卡。这会迫使用户再次选择第二个选项卡,但从那时起,只要用户保持在该活动中

这是一个影响3.0之前的平台的问题,即当Sherlock作为代理提供操作栏菜单项时

我有一个片段活动,它包含两个片段,每个片段都有自己的一组选项菜单。当活动启动时,将显示第一个片段选项卡,其菜单项正常工作。但是,第一次切换到其他选项卡时,其菜单项没有响应。如果我切换回第一个选项卡并再次选择另一个选项卡,它们将正常启动

看起来这是一个已知的问题。查看讨论

我现在的解决方法是检测第一次选择第二个选项卡,并通过编程切换回第一个选项卡。这会迫使用户再次选择第二个选项卡,但从那时起,只要用户保持在该活动中,该选项卡就会正常工作

我想知道是否有人找到了一个更优雅的解决这个问题的方法。谢谢

第一段:

  @Override
      public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
      moveMenuItem   = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.MOVE_FLASHES_ID, 0, R.string.move_flashes);
      cloneMenuItem  = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.CLONE_FLASHES_ID, 0, R.string.clone_flashes);
      deleteMenuItem = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.DELETE_FLASHES_ID, 0, R.string.delete_flashes);
      moveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      moveMenuItem.setIcon(R.drawable.move2red);
      cloneMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      cloneMenuItem.setIcon(R.drawable.hard_drive_clone);
      deleteMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      deleteMenuItem.setIcon(R.drawable.delete);
   }
   @Override
      public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
      saveMenuItem = menu.add(Flashum.MENU_GROUP_SAVE, Flashum.SAVE_CHANGES_ID, 0, R.string.save_changes);
      saveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      saveMenuItem.setIcon(R.drawable.save);
      menu.setGroupVisible(Flashum.MENU_GROUP_SAVE, true);

      recMenuItem = menu.add(Flashum.MENU_GROUP_REC, Flashum.RECORD_ID, 0, R.string.record);
      recMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      recMenuItem.setIcon(R.drawable.microphonehot);
   }
第二段:

  @Override
      public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
      moveMenuItem   = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.MOVE_FLASHES_ID, 0, R.string.move_flashes);
      cloneMenuItem  = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.CLONE_FLASHES_ID, 0, R.string.clone_flashes);
      deleteMenuItem = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.DELETE_FLASHES_ID, 0, R.string.delete_flashes);
      moveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      moveMenuItem.setIcon(R.drawable.move2red);
      cloneMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      cloneMenuItem.setIcon(R.drawable.hard_drive_clone);
      deleteMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      deleteMenuItem.setIcon(R.drawable.delete);
   }
   @Override
      public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
      saveMenuItem = menu.add(Flashum.MENU_GROUP_SAVE, Flashum.SAVE_CHANGES_ID, 0, R.string.save_changes);
      saveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      saveMenuItem.setIcon(R.drawable.save);
      menu.setGroupVisible(Flashum.MENU_GROUP_SAVE, true);

      recMenuItem = menu.add(Flashum.MENU_GROUP_REC, Flashum.RECORD_ID, 0, R.string.record);
      recMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      recMenuItem.setIcon(R.drawable.microphonehot);
   }

试着在你的菜单膨胀之前把它清理干净。因此,在onCreateOptions菜单方法中的片段中调用menu.clear();开始时,然后将菜单充气。 大概是这样的:

   @Override
  public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

  super.onCreateOptionsMenu(menu, inflater); 
  menu.clear();

  saveMenuItem = menu.add(Flashum.MENU_GROUP_SAVE, Flashum.SAVE_CHANGES_ID, 0, R.string.save_changes);
  saveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
  saveMenuItem.setIcon(R.drawable.save);
  menu.setGroupVisible(Flashum.MENU_GROUP_SAVE, true);

  recMenuItem = menu.add(Flashum.MENU_GROUP_REC, Flashum.RECORD_ID, 0, R.string.record);
  recMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
  recMenuItem.setIcon(R.drawable.microphonehot);
}


在两个片段中都尝试使用它。

不要在选择第二个选项卡时进行检测,而是在活动的onCreate中使用post-delayed方法以编程方式切换片段。例如,我有3个片段,我以相反的顺序(2,1,0)切换它们,在活动开始时用一个漂亮的动画愚弄用户:

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB){
  mIndicator.setCurrentItem(2);
  mIndicator.postDelayed(new Runnable() {
public void run() {
  mIndicator.setCurrentItem(1);
  mIndicator.postDelayed(new Runnable() {
    public void run() {
      mIndicator.setCurrentItem(0);
  }}, 100);
}}, 100);
}
if(android.os.Build.VERSION.SDK\u INT
谢谢你的建议,但没什么区别。很有趣。。。我对菜单项也有类似的问题,它对我很有效。您可以再试一件事,在menu.clear()之前向onCreateOptions菜单()添加super()调用;如下所示:@Override public void oncreateoptions菜单(菜单菜单,菜单充气器){super.oncreateoptions菜单(菜单,充气器);Menu.clear();//创建菜单的其余部分}尝试在两个片段中执行此操作。希望杰克能尽快解决这个问题,如果它不起作用的话。问候:)不客气:)据我所知,当您致电super.onCreateOptions菜单(菜单,充气机);在片段的onCreateOptionsMenu()中,它在活动中调用onCreateOptionsMenu(),然后在backStack中的所有片段中调用,这些片段已将setHasOptionsMenu()设置为true。所以,对于所有片段,您都要清除菜单,然后向其中添加项。我不知道它为什么会起作用,但这是一个非常简单的解决方案:)当你最初回答我的问题时,你的名声正好是1。现在1天后是91,所以你一直很忙!我记得我花了几个星期才到达你现在的位置。