java - openOptionsMenu() 不适用于 appcompat-v7 22.1.0 或更新版本

标签 java android android-support-library android-optionsmenu options-menu

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

openOptionsMenu() across android versions

openOptionsMenu() not working

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

本质上,对于较新版本的 appcompat-v7,如果您的 Activity 扩展了 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. 更改主 Activity 以扩展 Activity(即没有应用程序兼容性)- 它有效
  6. 更改主 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/

相关文章:

android - 是否需要导入 support-v4 和 appcompat-v7 才能使用它们?

android - 方法调用 mActionBar=getActionBar() 给出错误

java - 用 Java 写入资源?

Java 使用 lambda 表达式对一个对象中的字段求和

java - 将 Admob 广告添加到 Java 文件而不是 Xml

Android - 如何跟踪我的应用程序何时在下载它的设备上崩溃?

java - 在自定义 View 上使用 Android 支持设计库

java - 下标规则和一维数组

java - 带有内部类的请求-响应流模式

android - 如何获取gps位置android