openOptionsMenu()在appcompat-v7 22.1.0或更新版本中不起作用

我已经看到了几个问题的报告,其中openOptionsMenu()不适用于各种Android版本,例如:

openOptionsMenu()跨Android版本

openOptionsMenu()不起作用

但我所看到的问题似乎与正在使用的appcompat-v7支持库的版本有关。

从本质上讲,对于新版本的appcompat-v7,如果您的活动扩展了Activity ,将会调用openOptionsMenu(),但如果扩展ActionBarActivityAppCompatActivity (即使用兼容性库),将无法正常工作。 在旧版本的appcompat-v7中,它工作正常。

它是可重复的,如下所示:

  1. 在Android Studio中,导入示例“ActionBarCompat-Basic”
  2. 在屏幕上添加一个button,调用openOptionsMenu()
  3. 请注意,这可以正常工作,因为示例中使用了旧版本的库,appcompat-v7:21.0.3
  4. 改变依赖使用appcompat-v7:23.0.1,重build,当点击button时,菜单不会出现。
  5. 更改主要活动来扩展活动(即没有应用程序兼容性) – 它的工作原理
  6. 更改主要活动以扩展AppCompatActivity(即使用应用程序兼容性libarry) – 失败

经过一些testing,我发现这停止了在appcompat-v7:22.1.0中的工作,并将不再在此jar的任何新版本中工作。

在模拟器和物理设备上,以及在我testing的两个版本的Android版本5.1.1(23)和2.1(7)上,这种行为是相同的。

我已经添加了这个bug的评论: Android的问题跟踪器的错误

任何build议,意见或解决方法赞赏!

史蒂夫

我想我可能已经find了解决方法。 它涉及覆盖openOptionsMenu()方法:

 @Override public void openOptionsMenu() { mActionBar.showOverflowMenu(); } 

为了使showOverflowMenu()在具有低于API 19的物理菜单键的设备上工作,请使用以下方法: 如何强制执行操作栏溢出图标以显示

mActionBar分配如下:

 android.support.v7.widget.Toolbar mActionBar = (android.support.v7.widget.Toolbar) getActionBar(getWindow().getDecorView()) 

这是getActionBar()方法:

 public static ViewGroup getActionBar(View view) { try { if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; if (viewGroup instanceof android.support.v7.widget.Toolbar) { return viewGroup; } for (int i = 0; i < viewGroup.getChildCount(); i++) { ViewGroup actionBar = getActionBar(viewGroup.getChildAt(i)); if (actionBar != null) { return actionBar; } } } } catch (Exception e) { e.printStackTrace(); } return null; } 

从AppCompatActivity调用openOptionsMenu()现在可以工作了!

注意:我在API 26上testing了这个,但是看到getActionBar()方法的作用远远低于此,我没有看到其余的失败原因。

比stream浪者的post更简单,在genymotion和我的手机(棉花糖)中都很好:

 import android.support.v7.widget.Toolbar; //btMainMenu is a button public void btMainMenu_click(View view) { final View view2 = getWindow().getDecorView().findViewById(R.id.action_bar); if (view2 instanceof Toolbar) { ((Toolbar) view2).showOverflowMenu(); } else { System.out.println("What a pity!, it doesn't work..., view2 is not toolbar"); } } 

https://issuetracker.google.com/issues/37060139