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

时间:2015-09-14 23:43:41

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

我已经看过一些问题,其中 openOptionsMenu()无法在各种Android版本上运行,例如:

openOptionsMenu() across android versions

openOptionsMenu() not working

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

从本质上讲,对于较新版本的appcompat-v7,如果您的活动扩展活动,则在调用 openOptionsMenu()时菜单会正常显示,但如果您扩展 ActionBarActivity AppCompatActivity (即使用兼容性库)。在旧版本的appcompat-v7中,它可以正常工作。

可重复,如下:

  1. 在Android Studio中,导入示例' ActionBarCompat-Basic'
  2. 在屏幕上添加一个按钮,调用 openOptionsMenu()
  3. 请注意,这样可以正常工作,因为样本中使用了旧版本的库appcompat-v7:21.0.3
  4. 更改依赖关系以使用appcompat-v7:23.0.1,重建,当点击按钮时,菜单将出现。
  5. 更改主要活动以扩展活动(即没有应用程序兼容性) - 它可以正常工作
  6. 更改主要活动以扩展AppCompatActivity(即使用应用程序兼容性库) - 它失败
  7. 经过一些测试后,我发现这已停止在appcompat-v7:22.1.0中运行,并且将不再适用于此jar的任何较新版本。

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

    我已对此错误添加评论:Android issue tracker bug

    任何建议,想法或变通方法都会受到赞赏!

    -Steve

2 个答案:

答案 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");
    }
}

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