首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openOptionsMenu()不能在appcompat-v7 22.1.0或更高版本中工作

openOptionsMenu()不能在appcompat-v7 22.1.0或更高版本中工作
EN

Stack Overflow用户
提问于 2015-09-14 23:43:40
回答 1查看 1.9K关注 0票数 11

我看到了一些关于openOptionsMenu()不能在各种安卓版本上工作的问题的报告,例如:

跨安卓版本的openOptionsMenu()

openOptionsMenu()不工作

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

本质上,使用较新版本的appcompat-v7,如果您的活动扩展了活动,那么当调用openOptionsMenu()时,菜单会显示得很好,但是如果扩展ActionBarActivity或AppCompatActivity (即使用兼容性库),菜单就不会工作。在较早版本的appcompat-v7中,它工作得很好。

它是可复制的,如下:

  1. 在Android中,导入示例'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)上也是相同的。

我给这个bug添加了一个注释:Android问题跟踪程序错误

任何建议、想法或解决办法都值得赞赏!

-Steve

EN

回答 1

Stack Overflow用户

发布于 2017-07-04 19:51:12

我想我可能真的找到了解决办法。它涉及重写openOptionsMenu()方法:

代码语言:javascript
复制
@Override
public void openOptionsMenu()
{
    mActionBar.showOverflowMenu();
}

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

mActionBar被指定为这样的:

代码语言:javascript
复制
android.support.v7.widget.Toolbar mActionBar = (android.support.v7.widget.Toolbar) getActionBar(getWindow().getDecorView())

这是getActionBar()方法:

代码语言:javascript
复制
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;
}

openOptionsMenu()调用AppCompatActivity现在可以工作了!

注意:我在API 26上测试了,但是由于getActionBar()方法的工作效率远远低于这个值,我看不出它的其余部分会失败。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32575557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档