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

Java openOptionsMenu()在appcompat-v7 22.1.0或更新版本中不起作用,java,android,android-support-library,android-optionsmenu,options-menu,Java,Android,Android Support Library,Android Optionsmenu,Options Menu,我已经看到一些关于openOptionsMenu()无法在各种Android版本上运行的问题的报告,例如: 但我遇到的问题似乎与正在使用的appcompat-v7支持库的版本有关 本质上,对于较新版本的appcompat-v7,如果您的活动扩展了活动,则调用OpenOptions menu()时,菜单将显示良好,但如果您扩展了ActionBarActivity或AppCompative(即使用兼容性库),则菜单将不起作用。在appcompat-v7的旧版本中,它可以正常工作 它是可复制的,如

我已经看到一些关于openOptionsMenu()无法在各种Android版本上运行的问题的报告,例如:

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

本质上,对于较新版本的appcompat-v7,如果您的活动扩展了活动,则调用OpenOptions menu()时,菜单将显示良好,但如果您扩展了ActionBarActivity或AppCompative(即使用兼容性库),则菜单将不起作用。在appcompat-v7的旧版本中,它可以正常工作

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

  • 在Android Studio中,导入示例“ActionBarCompat Basic”
  • 在屏幕上添加一个按钮,该按钮将调用openOptionsMenu()
  • 请注意,由于示例中使用了库的旧版本appcompat-v7:21.0.3,因此这种方法可以正常工作
  • 将依赖项更改为使用appcompat-v7:23.0.1“重建”,单击按钮时,菜单将不会显示
  • 将主活动更改为扩展活动(即没有应用程序兼容性)-它可以工作
  • 将主活动更改为扩展AppCompativeActivity(即使用app compatibility libarry)-失败
  • 经过一些测试,我发现它在appcompat-v7:22.1.0中停止工作,并且在这个jar的任何更新版本中都不再工作

    这种行为在模拟器和物理设备上是相同的,在Android版本5.1.1(23)和2.1(7)上也是相同的,这两个版本是我测试它的两个版本

    我对这个bug添加了一条评论:

    任何建议、想法或解决方法都将不胜感激


    -史蒂夫

    我想我可能已经找到了解决办法。它涉及覆盖
    openoptions菜单()
    方法:

    @Override
    public void openOptionsMenu()
    {
        mActionBar.showOverflowMenu();
    }
    
    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;
    }
    
    要使
    showOverflowMenu()
    在物理菜单键低于API 19的设备上工作,请使用以下命令:

    mActionBar
    分配如下:

    android.support.v7.widget.Toolbar mActionBar = (android.support.v7.widget.Toolbar) getActionBar(getWindow().getDecorView())
    
    这是
    getActionBar()
    方法:

    @Override
    public void openOptionsMenu()
    {
        mActionBar.showOverflowMenu();
    }
    
    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;
    }
    
    公共静态视图组getActionBar(视图)
    {
    尝试
    {
    if(视图组的视图实例)
    {
    ViewGroup ViewGroup=(ViewGroup)视图;
    if(android.support.v7.widget.Toolbar的视图组实例)
    {
    返回视图组;
    }
    对于(int i=0;i
    从AppCompatActivity调用
    OpenOptions菜单()
    现在可以工作了


    注意:我在API 26上对此进行了测试,但鉴于
    getActionBar()
    方法的工作原理远低于此,我看不出其他方法会失败的原因。

    比漫游者的帖子更简单,它在genymotion和我的手机(棉花糖)中都很好:


    我遇到了相同的错误:(