问题
I have ordinary activity with Option Menu, which I created by this code:
@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;
}
On Android 2.3 and older (2.2, 2.1) is everything fine. But when I run this app on Android 4.0 (ICS - emulator, Galaxy Nexus, Nexus S) when I press menu button the app crashdown with this exception:
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)
I can't localize resource with ID #0x1090044 (it's not in my R.java or any other files) and I don't know what it should be. Maybe some internal menu layout? I already also tried to clean the project. I know that there are new "desing rules" for Android 4.0 ICS and using Action Bar instead older menu, but I need this code get working even on ICS for many different reasons. Should I some how edit this code to work even on ICS? I also already tried creating menu from XML file using this code with same exception.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
Thank you for any advice!
回答1:
Finally! The problem was in something slightly different. I was using this code:
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);
I didn't check this wrong line of code before because on 2.3 and less everything was fine. But now on 4.0 something was changed in internal resources. I don't know if it is some sort of bug (I'm calling this code for many times in my Activity but only when I use Options menu error is raised), but for sure there was the bug in my code.
回答2:
Try clean project and run again. If error isn't gone, check what's the id value in R.java for your menu (R.menu.menu) or if it exists.
回答3:
According to your Answer the code to manually change locale causes the error but looking at your stack trace it seems that you may have a resource missing, but anyway I have similar Locale change code and was experiencing errors only under ICS so I have added the following in the hope that it may be helpful:
To prevent the error add the following to AndroidManifest.xml android:configChanges="locale"
Here is an extract from Activity Javadoc that explains why the error may occur:
In some special cases, you may want to bypass restarting of your
activity based on one or more types of configuration changes. This is done with the android:configChanges attribute in its manifest. For any types of configuration changes you say that you handle there, you will receive a call to your current activity's
onConfigurationChanged method instead of being restarted. If a configuration change involves any that you do not handle, however, the activity will still be restarted and onConfigurationChanged will not be called.
来源:https://stackoverflow.com/questions/8576484/crash-when-opening-option-menu