2012-04-18 86 views
4

我的应用程序有一些活动,都有一个选项菜单,这是一样的。它工作正常,只有在一个活动(一个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); 
} 

例外不会在应用程序代码的发生,也不会似乎参考应用程序的一个的ressource(它们的存在,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) 

任何想法?帮助非常感谢,这是一个预发布阻滞剂..

+0

在哪个文件夹中是那个menu.xml(或者任何0x1090044是 - 见R.java in/gen /)? – zapl 2012-04-18 15:28:54

+0

没有xml菜单。上面提到的资源并不是应用程序的资源之一,它似乎必须是Android内部资源。 – Bachi 2012-04-18 19:18:15

+0

万一它帮助某人,这是上面堆栈跟踪的Android源代码,这要感谢grepcode.com:http://tinyurl.com/cbpo882 – Bachi 2012-04-18 19:55:21

回答

2

终于解决了这个问题。这是相当隐藏在这行代码(出现在一个完全不同的位置):

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

最后一个参数应包含的配置,但包含空值。看来,一直工作到安卓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)类,我们在项目中)

也见Crash when opening Option Menu

使用3210
+1

顺便说一句:该行在前段时间被修复UrlImageViewHelper,我有一个旧版本。见https://github.com/koush/UrlImageViewHelper/issues/3 – Bachi 2012-04-20 18:17:03

+0

哇,谢谢百万Bachi。我一直在试图寻找这种间歇性错误的来源多年。它一直让我疯狂:) – 2012-06-03 21:48:54

相关问题