Сбой при открытии меню параметров - PullRequest
3 голосов
/ 20 декабря 2011

У меня обычная активность с Option Menu, которое я создал с помощью этого кода:

@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);

Спасибо за любой совет!

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Наконец-то! Проблема была в чем-то немного другом. Я использовал этот код:

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 что-то изменилось во внутренних ресурсах. Я не знаю, является ли это какой-то ошибкой (я много раз вызываю этот код в своей Деятельности, но только когда я использую ошибку меню «Параметры»), но наверняка была ошибка в моем коде.

0 голосов
/ 15 августа 2012

В соответствии с вашим Ответом код для изменения локали вручную вызывает ошибку, но при просмотре трассировки стека может показаться, что у вас может отсутствовать ресурс, но в любом случае у меня есть аналогичный код изменения локали, и я обнаружил ошибки только в ICS, поэтому у меня естьдобавил следующее в надежде, что это может быть полезно:

Чтобы предотвратить ошибку, добавьте следующее в AndroidManifest.xml android: configChanges = "locale"

Вот выдержка из Activity Javadoc, котораяобъясняет причину возникновения ошибки:

В некоторых особых случаях может потребоваться обойти перезапуск вашей
активности на основании одного или нескольких типов изменений конфигурации.Это делается с помощью атрибута android: configChanges в его манифесте.Для любых типов изменений конфигурации, которые, как вы говорите, вы обрабатываете там, вы будете получать вызов метода
onConfigurationChanged вашей текущей деятельности, а не перезапускаться.Если изменение конфигурации включает в себя любое, которое вы не обрабатываете, действие все равно будет перезапущено и onConfigurationChanged не будет вызываться.

0 голосов
/ 20 декабря 2011

Попробуйте очистить проект и запустите снова.Если ошибка не исчезла, проверьте значение идентификатора в R.java для вашего меню (R.menu.menu) или существует.

...