Ste*_*ley 11 java android options-menu android-optionsmenu android-support-library
我已经看到几个关于openOptionsMenu()无法在各种Android版本上运行的问题的报告,例如:
但我遇到的问题似乎与正在使用的appcompat-v7支持库的版本有关.
实质上,对于较新版本的appcompat-v7,如果您的活动扩展了Activity,则在调用openOptionsMenu()时菜单将显示正常,但如果您扩展ActionBarActivity或AppCompatActivity(即使用兼容性库)则不会起作用.在较旧版本的appcompat-v7中,它可以正常工作.
它是可重复的,如下:
经过一些测试后,我发现这已停止在appcompat-v7:22.1.0中运行,并且将不再适用于此jar的任何较新版本.
这种行为在模拟器和物理设备上是相同的,在Android版本5.1.1(23)和2.1(7)上是我测试过的两个版本.
我添加了对此错误的评论:Android问题跟踪器错误
任何建议,想法或变通方法表示赞赏!
史蒂夫
我想我可能实际上已经找到了解决方法。它涉及重写该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()方法的工作效率远远低于该值,我认为其余部分没有理由会失败。
| 归档时间: |
|
| 查看次数: |
1452 次 |
| 最近记录: |