2011-12-20 83 views
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)这个程序当我按下菜单按钮的应用程序crashdown与此异常:

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有新的“设计规则”,并使用Action Bar代替旧菜单,但是我需要此代码即使在ICS上也有许多不同的原因。我应该如何编辑此代码即使在ICS上也能工作? 我也已经尝试使用此代码从XML文件创建菜单,但也有例外。

MenuInflater inflater = getMenuInflater(); 
inflater.inflate(R.menu.menu, menu); 

谢谢任何​​建议!

+0

[此示例项目(https://github.com/commonsguy/cw-android/tree/master/Menus/Menus)创建一个从'menu.add()'选项菜单,并能正常工作在ICS上。 – CommonsWare 2011-12-20 18:53:14

+0

谢谢。我知道如何创建选项菜单,我很确定它在ICS上工作。但在我的情况和我目前的项目中有这种错误,不知道它是怎么做的。 – Warlock 2011-12-21 13:13:12

+0

我给你提供一个工作示例项目的原因是,你可以开始比较你正在做的和正在工作的示例项目做什么,直到你发现事情出错的地方。 – CommonsWare 2011-12-21 13:42:19

回答

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菜单错误时才提出),但是肯定在我的代码中存在错误。

+0

不相信这是你的错误:)。我有同样的问题,但是没有像你上面的例子。在这里提交了一个bug:http://code.google.com/p/android/issues/detail?id = 28807 - 也许他们可以更深入地检查一个级别。 – Bachi 2012-04-13 22:01:56

+0

我有类似的语言环境代码,以上列出,并可以确认我也遇到ICS崩溃,但我的代码稍有不同,因为它在应用程序类;结果是不断调用onCreate方法。 – Martin 2012-08-15 07:48:05

+0

这里没有足够的空间,所以我在下面添加了一个答案,详细说明了为什么更改区域设置会导致错误以及如何防止错误... – Martin 2012-08-15 10:08:11

0

尝试清洁项目并再次运行。如果错误没有消失,请检查R.java中的id值是否是菜单(R.menu.menu)或是否存在。

+0

我清理并构建了多次项目,但缺少的资源ID 0x1090044不在此处。菜单(R.menu.menu)存在并具有不同的ID。 – Warlock 2011-12-20 14:16:02

+0

这听起来像是ICS本身的问题。我怀疑缺少的资源ID是com.android.internal.R.layout.list_menu_item_layout。 – pinxue 2011-12-20 14:42:35

0

根据您的答案手动更改区域设置的代码会导致错误,但看着你的堆栈跟踪,似乎你可能有一个资源缺失,但无论如何,我有类似的区域设置更改代码,并且只有在ICS下遇到错误,所以我添加在希望对大家有所帮助如下:

为了防止错误以下内容添加到AndroidManifest.xml中的android :configChanges =“区域设置”

下面是活动的Javadoc这可以解释为什么提取物该错误可能发生:

在某些特殊情况下,您可能希望基于一种或多种类型的配置更改,绕过重新启动您的活动
活动。这是用其清单中的android:configChanges属性完成的 。对于 您说在那里处理的任何类型的配置更改, 您将收到一个对当前活动的调用
onConfigurationChanged方法,而不是重新启动。但是,如果配置更改涉及任何您不处理的内容,则 活动仍将重新启动,并且不会调用onConfigurationChanged 。

+0

我已经将此configChanges属性设置为区域设置,所以它不是我的问题。但有人可能会有类似的问题。 – Warlock 2012-08-15 11:14:51