我已经看过一些问题,其中 openOptionsMenu()无法在各种Android版本上运行,例如:
openOptionsMenu() across android versions
但我遇到的问题似乎与正在使用的appcompat-v7支持库的版本有关。
从本质上讲,对于较新版本的appcompat-v7,如果您的活动扩展活动,则在调用 openOptionsMenu()时菜单会正常显示,但如果您扩展 ActionBarActivity 或 AppCompatActivity (即使用兼容性库)。在旧版本的appcompat-v7中,它可以正常工作。
可重复,如下:
经过一些测试后,我发现这已停止在appcompat-v7:22.1.0中运行,并且将不再适用于此jar的任何较新版本。
此行为在模拟器和物理设备上以及Android版本5.1.1(23)和2.1(7)上是相同的,这是我测试过的两个版本。
我已对此错误添加评论:Android issue tracker bug
任何建议,想法或变通方法都会受到赞赏!
-Steve
答案 0 :(得分:3)
我想我可能实际上找到了解决方法。它涉及覆盖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()
方法远远低于此值,我认为其余部分都没有理由失败。
答案 1 :(得分:0)
比Wanderer的帖子更简单,它在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");
}
}