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

Ste*_*ley 11 java android options-menu android-optionsmenu android-support-library

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

跨Android版本的openOptionsMenu()

openOptionsMenu()不起作用

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

实质上,对于较新版本的appcompat-v7,如果您的活动扩展了Activity,则在调用openOptionsMenu()时菜单将显示正常,但如果您扩展ActionBarActivityAppCompatActivity(即使用兼容性库)则不会起作用.在较旧版本的appcompat-v7中,它可以正常工作.

它是可重复的,如下:

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

经过一些测试后,我发现这已停止在appcompat-v7:22.1.0中运行,并且将不再适用于此jar的任何较新版本.

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

我添加了对此错误的评论:Android问题跟踪器错误

任何建议,想法或变通方法表示赞赏!

史蒂夫

The*_*rer 3

我想我可能实际上已经找到了解决方法。它涉及重写该openOptionsMenu()方法:

@Override
public void openOptionsMenu()
{
    mActionBar.showOverflowMenu();
}
Run Code Online (Sandbox Code Playgroud)

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

mActionBar被这样分配:

android.support.v7.widget.Toolbar mActionBar = (android.support.v7.widget.Toolbar) getActionBar(getWindow().getDecorView())
Run Code Online (Sandbox Code Playgroud)

这是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;
}
Run Code Online (Sandbox Code Playgroud)

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

注意:我在 API 26 上对此进行了测试,但由于该getActionBar()方法的工作效率远远低于该值,我认为其余部分没有理由会失败。