【问题标题】:Sherlock option menu item does not respondSherlock 选项菜单项没有响应
【发布时间】:2013-05-12 19:56:27
【问题描述】:

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

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

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

我现在的解决方法是检测第一次选择第二个选项卡并以编程方式切换回第一个选项卡。这会强制用户再次选择第二个选项卡,但从那时起,只要用户停留在该活动中,它就可以正常工作。

我想知道是否有人找到了解决此问题的更优雅的解决方案。谢谢!

第一个片段:

  @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);
   }

【问题讨论】:

    标签: android actionbarsherlock


    【解决方案1】:

    在将菜单添加到片段中之前,请尝试清除菜单。因此,在 onCreateOptionsMenu 方法中的片段中调用 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);
    

    }

    在你的两个片段中尝试一下。

    【讨论】:

    • 感谢您的建议,但没有区别。
    • 有趣...我在菜单项上遇到了类似的问题,它对我有用。您可以再尝试一件事,在 menu.clear() 之前将 super() 调用添加到您的 onCreateOptionsMenu();像这样:@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.clear(); //其余的创建菜单 } 尝试在您的两个片段中执行此操作。如果它不起作用,我们希望 Jake 能尽快解决这个问题。问候:)
    • 不客气 :) 据我所知,当您致电 super.onCreateOptionsMenu(menu, inflater);在您的片段的 onCreateOptionsMenu() 中,它在您的活动中调用 onCreateOptionsMenu(),然后在 backStack 中已将 setHasOptionsMenu() 设置为 true 的所有片段中调用。因此,对于所有片段,您要清除菜单,然后向其中添加项目。我不完全知道它为什么起作用,但它是非常简单的解决方案:)
    • 当你最初回答我的问题时,你的声誉正好是 1。现在 1 天后是 91,所以你一直很忙!我记得我花了几个星期才到达你所在的位置。
    【解决方案2】:

    不是检测何时选择了第二个选项卡,而是使用延迟后的方法在 Activity 的 onCreate 中以编程方式切换片段。例如,我有 3 个片段,我以相反的顺序(2、1、0)切换它们,它会在 Activity 开始时用漂亮的动画欺骗你的用户:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2015-06-27
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      相关资源
      最近更新 更多