打开选项菜单时崩溃

3

我使用以下代码创建了普通的选项菜单:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, 1, 0, "A");
  menu.add(0, 2, 0, "B");
  menu.add(0, 3, 0, "C");
  return true;
}

在Android 2.3及以下版本(2.2、2.1),一切都正常。但是在Android 4.0(ICS - 模拟器、Galaxy Nexus、Nexus S)上运行此应用程序时,当我按下菜单按钮时,应用程序会崩溃并出现以下异常:
W/ResourceType(9263): Failure getting entry for 0x01090044 (t=8 e=68) in package 0 (error -75)
D/AndroidRuntime(9263): Shutting down VM
W/dalvikvm(9263): threadid=1: thread exiting with uncaught exception (group=0x40a4a1f8)
FATAL EXCEPTION: main
android.content.res.Resources$NotFoundException: Resource ID #0x1090044
E/AndroidRuntime(9263):
at android.content.res.Resources.getValue(Resources.java:1019)
at android.content.res.Resources.loadXmlResourceParser(Resources.java:2107)
at android.content.res.Resources.getLayout(Resources.java:858)
at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
at com.android.internal.view.menu.BaseMenuPresenter.getMenuView(BaseMenuPresenter.java:70)
at com.android.internal.policy.impl.PhoneWindow$PanelFeatureState.getIconMenuView(PhoneWindow.java:3298)
at com.android.internal.policy.impl.PhoneWindow.initializePanelContent(PhoneWindow.java:1096)
at com.android.internal.policy.impl.PhoneWindow.openPanel(PhoneWindow.java:559)
at com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel(PhoneWindow.java:817)
at com.android.internal.policy.impl.PhoneWindow.onKeyUp(PhoneWindow.java:1486)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1813)
at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3300)
at android.view.ViewRootImpl.handleFinishedEvent(ViewRootImpl.java:3273)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2436)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

我无法找到ID为#0x1090044的资源(它不在我的R.java或任何其他文件中),我也不知道它应该是什么。也许是一些内部菜单布局?我已经尝试过清理项目了。 我知道Android 4.0 ICS有新的“设计规则”,使用操作栏而不是旧菜单,但出于许多不同原因,我需要使这段代码即使在ICS上也能正常工作。我应该如何编辑此代码以使其即使在ICS上也能正常工作? 我还尝试使用相同异常创建来自XML文件的菜单的代码。
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);

感谢您提供的任何建议!


该示例项目(https://github.com/commonsguy/cw-android/tree/master/Menus/Menus)使用`menu.add()`创建了一个选项菜单,在ICS上运行良好。 - CommonsWare
谢谢。我知道如何创建选项菜单,并且我相当确定它可以在ICS上工作。但是在我的情况和当前项目中出现了这种错误,不知道该怎么处理它。 - Warlock
我指向一个可工作的示例项目的原因是让你可以开始将你所做的与示例项目所做的进行比较,直到找到出错的地方。 - CommonsWare
对于其他遇到这个问题的人,我也遇到了:它只出现在运行Android 4.0.3的设备上。错误出现在getMenuView中,目前没有办法拦截并停止它。在我的情况下,我只是删除了选项菜单的使用。 - Femi
3个回答

2

终于找到问题所在了!问题出在代码略有不同。我正在使用以下代码:

Resources standardResources = getResources();
AssetManager assets = standardResources.getAssets();
DisplayMetrics metrics = standardResources.getDisplayMetrics();
Configuration config = new Configuration(); 
// CORRECT is: Configuration config = standardResources.getConfiguration();
config.locale = new Locale(lang);
Resources defaultResources = new Resources(assets, metrics, config);

在2.3及以下版本中,一切都正常,因此我没有检查这行错误的代码。但是现在在4.0版本上,内部资源发生了某些变化。我不知道这是否是某种错误(我在我的Activity中多次调用此代码,但仅在使用Options菜单时才会引发错误),但是我的代码肯定存在错误。


我不确定这是你的错误 :). 我有相同的问题,但没有如上面提到的示例。 在此处提交了一个错误:http://code.google.com/p/android/issues/detail?id=28807 - 也许他们可以深入检查一级。 - Bachi
我有类似于上面列出的区域设置代码,并且可以确认我在ICS中也遇到了崩溃问题,但我的代码略有不同,因为它在Application类中;结果是不断调用onCreate方法。 - Martin
这里的空间不够,所以我在下面附上了一个答案,详细说明了为什么更改Locale会导致错误以及如何防止它发生... - Martin
我在我的Activity超类的onCreate方法中有这段代码。只是为了让它更清晰明了。 - Warlock

0
根据您的回答,手动更改语言环境的代码会导致错误,但是查看您的堆栈跟踪,似乎可能缺少某些资源。无论如何,我有类似的Locale更改代码,在ICS下仅遇到错误,因此我已添加了以下内容,希望它可能有所帮助:
为了防止错误,请在AndroidManifest.xml中添加以下内容 android:configChanges="locale"
以下是Activity Javadoc的摘录,解释了为什么可能会出现错误:
在某些特殊情况下,您可能希望基于一种或多种类型的配置更改绕过重新启动您的活动。这是通过其清单中的android:configChanges属性完成的。对于您说您在那里处理的任何类型的配置更改,您将收到当前活动的onConfigurationChanged方法的调用,而不是重新启动。但是,如果配置更改涉及您不处理的任何更改,则仍将重新启动活动,并且不会调用onConfigurationChanged。

我已经将configChanges属性设置为locale,所以这不是我的问题。但是可能有人会遇到类似的问题。 - Warlock

0
尝试清理项目并重新运行。如果错误仍然存在,请检查您的菜单(R.menu.menu)在R.java中的id值是否存在。

我已经多次清理和构建项目,但缺失的资源ID 0x1090044 并不存在。菜单(R.menu.menu)存在,但具有不同的ID。 - Warlock
这似乎是ICS本身的问题。我怀疑缺少的资源ID是com.android.internal.R.layout.list_menu_item_layout。 - pinxue

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