2012-04-18 87 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

相關問題