Сбой при открытии меню параметров

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

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

Я не могу локализовать ресурс с идентификатором #0x1090044 (его нет ни в моем R.java, ни в других файлах), и я не знаю, каким он должен быть. Может быть, какая-то внутренняя структура меню? Я уже и пробовал чистить проект. Я знаю, что существуют новые «правила дизайна» для Android 4.0 ICS и использование панели действий вместо старого меню, но мне нужно, чтобы этот код работал даже на ICS по разным причинам. Должен ли я как-то отредактировать этот код, чтобы он работал даже на ICS? Я также уже пытался создать меню из файла XML, используя этот код с тем же исключением.

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

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


person Warlock    schedule 20.12.2011    source источник
comment
Этот пример проекта создает меню параметров из menu.add() и отлично работает на ICS.   -  person CommonsWare    schedule 20.12.2011
comment
Спасибо. Я знаю, как создать меню опций, и я уверен, что оно работает на ICS. Но в моем случае и в моем текущем проекте есть такая ошибка, и я не знаю, что с ней делать.   -  person Warlock    schedule 21.12.2011
comment
Причина, по которой я указал вам на рабочий пример проекта, заключается в том, что вы можете начать сравнивать то, что вы делаете, с тем, что делает рабочий пример проекта, пока не обнаружите, где что-то идет не так.   -  person CommonsWare    schedule 21.12.2011
comment
Для всех, у кого есть эта проблема, это также происходит со мной: единственные устройства, на которых она появляется, — это устройства под управлением Android 4.0.3. Ошибка находится в getMenuView, и в настоящее время нет способа ее перехватить и остановить. В моем случае я просто удаляю использование меню опций.   -  person Femi    schedule 18.04.2012


Ответы (3)


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

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

person Warlock    schedule 22.12.2011
comment
Не уверен, что это была ваша ошибка :). У меня такая же проблема, но ничего похожего на ваш пример выше. Сообщил об ошибке здесь: code.google.com/p/android/issues. /detail?id=28807 - может быть, они могут проверить на один уровень глубже. - person Bachi; 14.04.2012
comment
У меня есть код локали, аналогичный приведенному выше, и я могу подтвердить, что у меня также возникают сбои в ICS, но мой код немного отличается, потому что он находится в классе Application; результатом является постоянный вызов методов onCreate. - person Martin; 15.08.2012
comment
Здесь недостаточно места, поэтому я добавил ответ ниже с подробностями о том, почему изменение локали вызывает ошибку и как ее предотвратить... - person Martin; 15.08.2012
comment
У меня был этот код в моем суперклассе Activity в методе onCreate. Просто чтобы было понятнее. - person Warlock; 15.08.2012

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

person pinxue    schedule 20.12.2011
comment
Я очищал и собирал проект много раз, но отсутствующего идентификатора ресурса 0x1090044 здесь нет. Меню (R.menu.menu) существует и имеет другой идентификатор. - person Warlock; 20.12.2011
comment
Это похоже на проблему самого ICS. Я подозреваю, что отсутствующий идентификатор ресурса — com.android.internal.R.layout.list_menu_item_layout. - person pinxue; 20.12.2011

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

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

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

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

person Martin    schedule 15.08.2012
comment
У меня уже был установлен этот атрибут configChanges для локали, так что это не моя проблема. Но может у кого-то есть похожая проблема. - person Warlock; 15.08.2012