在appcompat-v7 22.1.0版本或更高版本中,openOptionsMenu()将无法使用。

11
我看到了一些关于在不同的Android版本上无法使用openOptionsMenu()的问题的报告,例如:

在不同版本的Android上使用openOptionsMenu()

openOptionsMenu()无法工作

但是,我遇到的问题似乎与所使用的appcompat-v7支持库的版本有关。
简而言之,如果您的活动扩展了Activity,则使用较新版本的appcompat-v7时,在调用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(即无应用程序兼容性)-它可以工作
  6. 将主活动更改为扩展AppCompatActivity(即使用应用程序兼容库)-它失败了

经过一些测试,我发现这在appcompat-v7:22.1.0中停止工作,并且在此jar的任何更新版本中都将不再起作用。

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

我已经在这个bug上添加了评论:Android issue tracker bug

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

我也遇到了同样的 bug :( - You'reAGitForNotUsingGit
2个回答

3

我认为我可能已经找到了一个解决方法。它涉及覆盖 openOptionsMenu() 方法:

@Override
public void openOptionsMenu()
{
    mActionBar.showOverflowMenu();
}

为了使具有物理菜单键且低于API 19的设备上的showOverflowMenu()起作用,请使用以下方法:如何强制显示操作栏溢出图标 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()方法可以在更低版本中工作,我认为其他部分也不会失败。


0

比The 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");
    }
}

https://issuetracker.google.com/issues/37060139


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接