Android: исключение меню параметров в Android 3+/Resources$NotFoundException: идентификатор ресурса # 0x1090044

В моем приложении есть несколько действий, все они имеют одинаковое меню параметров. Он отлично работает, только в одном действии (подклассе ListView) происходит сбой при нажатии кнопки меню.

Это происходит только в 4.x (возможно, 3.x - не могу проверить), но не в 2.3 или более ранних версиях. Проверял в эмуляторе и на разных устройствах.

Интересный факт: когда я поворачиваю устройство после рендеринга активности и затем нажимаю кнопку меню, оно работает нормально.

Кроме того, меню работает, пока адаптер списка загружается, а список пуст. После заполнения списка возникает проблема (как уже упоминалось, только выше версии 2.3)

Само меню может быть простым однострочным вообще без ресурса, такое еще бывает.

Код меню опций:

/**
 * Prepare the options menu
 * @param menu The menu
 * @return You must return true for the menu to be displayed; if you return false it will not be shown.
 */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    menu.clear();

    title = getString(R.string.optionsmenu_search);
    MenuItem item1 = menu.add(Menu.NONE, MENU_SEARCH, Menu.NONE, title);        
    item1.setIcon(R.drawable.ic_menu_search);

    return super.onPrepareOptionsMenu(menu);
}

 * Handle options menu click
 * @param item menu item
 * @return
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        // ...
    }
    return OptionsMenu.itemSelected(this, item) || super.onOptionsItemSelected(item);
}

Исключение не возникает в коде приложения и, похоже, не ссылается на ресурс приложения (они существуют, R много раз удалялся/перестраивался, проект очищался и т. д.)

Трассировка стека: (похоже, он ссылается на какой-то ресурс xml, но меню не основано на xml)

04-13 23:45:39.081: E/AndroidRuntime(2933): FATAL EXCEPTION: main
04-13 23:45:39.081: E/AndroidRuntime(2933): android.content.res.Resources$NotFoundException: Resource ID #0x1090044
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.content.res.Resources.getValue(Resources.java:1019)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.content.res.Resources.loadXmlResourceParser(Resources.java:2107)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.content.res.Resources.getLayout(Resources.java:858)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.view.menu.BaseMenuPresenter.getMenuView(BaseMenuPresenter.java:70)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.policy.impl.PhoneWindow$PanelFeatureState.getIconMenuView(PhoneWindow.java:3298)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.policy.impl.PhoneWindow.initializePanelContent(PhoneWindow.java:1096)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.policy.impl.PhoneWindow.openPanel(PhoneWindow.java:559)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel(PhoneWindow.java:817)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.policy.impl.PhoneWindow.onKeyUp(PhoneWindow.java:1486)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1813)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3300)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.view.ViewRootImpl.handleFinishedEvent(ViewRootImpl.java:3273)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2436)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.os.Looper.loop(Looper.java:137)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at android.app.ActivityThread.main(ActivityThread.java:4340)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at java.lang.reflect.Method.invoke(Method.java:511)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-13 23:45:39.081: E/AndroidRuntime(2933):     at dalvik.system.NativeStart.main(Native Method)

Есть идеи? Помощь очень ценится, это один блокировщик перед запуском.


person Bachi    schedule 18.04.2012    source источник
comment
в какой папке находится этот файл menu.xml (или что-то еще 0x1090044 — см. R.java в /gen/)?   -  person zapl    schedule 18.04.2012
comment
нет xml-меню. Упомянутый ресурс не является одним из приложений, кажется, это внутренний ресурс Android.   -  person Bachi    schedule 18.04.2012
comment
если это кому-то поможет, вот исходный код Android для трассировки стека выше, благодаря grepcode.com: tinyurl.com/cbpo882   -  person Bachi    schedule 18.04.2012
comment
То, что вы делаете в onPrepareOptionsMenu, должно быть в onCreateOptionsMenu imo - сброс меню каждый раз, когда вы его показываете, не является обязательным (может даже быть связано с вашей ошибкой). Я думаю, это com.android.internal.R.id.icon_menu_presenter, который не найден. Это <item type="id" name="icon_menu_presenter" /> и нет макета. Не знаю, что это значит сейчас :)   -  person zapl    schedule 19.04.2012


Ответы (1)


Наконец решил проблему. Это довольно скрыто в этой строке кода (которая появляется в совершенно другом месте):

mResources = new Resources(mgr, mMetrics, null);

Последний параметр должен содержать конфигурацию, но содержит null. Кажется, это работало до Android 3.x

Вот старый код, содержащий строку неисправности:

private static void prepareResources(Context context) {
    if (mMetrics != null)
        return;
    mMetrics = new DisplayMetrics();
    Activity act = (Activity)context;
    act.getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
    AssetManager mgr = context.getAssets();
    mResources = new Resources(mgr, mMetrics, null);
}

Это решило проблему (обратите внимание на последнюю строку):

private static void prepareResources(Context context) {
    if (mMetrics != null)
        return;
    mMetrics = new DisplayMetrics();
    Activity act = (Activity)context;
    act.getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
    AssetManager mgr = context.getAssets();
    mResources = new Resources(mgr, mMetrics, act.getResources().getConfiguration());
}

(Код находится в классе UrlImageViewHelper (https://github.com/koush/UrlImageViewHelper), который мы использовать в проекте)

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

person Bachi    schedule 20.04.2012
comment
Кстати: строка была исправлена ​​в UrlImageViewHelper некоторое время назад, у меня была более старая версия. См. github.com/koush/UrlImageViewHelper/issues/3. - person Bachi; 20.04.2012
comment
Вау, огромное спасибо, Бачи. Я пытался выследить источник этой прерывистой ошибки целую вечность. Это сводило меня с ума :) - person Chris Knight; 04.06.2012