4

私のアプリにはいくつかのアクティビティがあり、すべて同じオプション メニューがあります。1 つのアクティビティ (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)

何か案が?大いに感謝します、それは1つの事前起動ブロッカーです..

4

1 に答える 1

2

最後に問題を解決しました。次のコード行にはかなり隠されています (まったく別の場所に表示されます)。

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 ) クラスにあります)

オプション メニューを開いたときにクラッシュするも参照してください。

于 2012-04-20T18:07:30.920 に答える