我已经看到一些关于 openOptionsMenu() 无法在各种 Android 版本上运行的问题的报告,例如:
openOptionsMenu() across android versions
但我遇到的问题似乎与正在使用的 appcompat-v7 支持库的版本有关。
本质上,对于较新版本的 appcompat-v7,如果您的 Activity 扩展了 Activity,则在调用 openOptionsMenu() 时,菜单会正常显示,但如果您扩展ActionBarActivity 或AppCompatActivity(即使用兼容性库)。在旧版本的 appcompat-v7 中它工作正常。
它是可重现的,如下:
- 在 Android Studio 中,导入示例“ActionBarCompat-Basic”
- 在屏幕上添加一个按钮,调用openOptionsMenu()
- 请注意,这工作正常,因为示例中使用了旧版本的库 appcompat-v7:21.0.3
- 更改依赖关系以使用 appcompat-v7:23.0.1,重新构建,然后单击按钮时菜单不会出现。
- 更改主 Activity 以扩展 Activity(即没有应用程序兼容性)- 它有效
- 更改主 Activity 以扩展 AppCompatActivity(即使用应用兼容性库)- 失败
经过一些测试,我发现它在 appcompat-v7:22.1.0 中停止工作,并且将不再在这个 jar 的任何更新版本中工作。
此行为在模拟器和物理设备上是相同的,在我测试它的两个版本 Android 5.1.1(23) 和 2.1(7) 上也是相同的。
我已经对此错误添加了评论:Android issue tracker bug
感谢任何建议、想法或解决方法!
-史蒂夫
最佳答案
我想我可能真的找到了解决方法。它涉及覆盖 openOptionsMenu()
方法:
@Override
public void openOptionsMenu()
{
mActionBar.showOverflowMenu();
}
为了让 showOverflowMenu()
在具有低于 API 19 的物理菜单键的设备上工作,请使用:How to force action bar overflow icon to show
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 上对此进行了测试,但鉴于 getActionBar()
方法的工作远低于此,我看不出其余部分会失败的原因。
关于java - openOptionsMenu() 不适用于 appcompat-v7 22.1.0 或更新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32575557/