【问题标题】:Gingerbread Crash When Using onCreateOptionsMenu()?使用 onCreateOptionsMenu() 时姜饼崩溃?
【发布时间】:2012-05-08 00:46:53
【问题描述】:

我的应用在 ICS emu 上运行良好。但是,使用 Gingerbread 时,只要我的 onCreateOptionsMenu 正在使用,它就会崩溃。如果我改用 showPopup,它还会引发另一组类似但不同的错误。有谁知道这里到底发生了什么? 理想情况下,我希望有一段菜单代码(当然不包括侦听器),它将为运行应用程序的所有 android 版本布置一个菜单。不过,我应该提一下,我有一个 GUI 菜单按钮(作为 ImageView 位于我的 XML 文件中),而不是 ActionBar 中的一个。所以,这里是代码:

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;

}

这里是菜单 XML:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/demographics"
              android:title="@string/demographics" />
        <item android:id="@+id/tabSelection"
              android:title="@string/tabs" />            
        <item android:id="@+id/settings"
              android:title="@string/settings" />


</menu>

这是 LogCat:

threadid=1: thread exiting with uncaught exception (group=0x40015560)
FATAL EXCEPTION: main
java.lang.IllegalStateException: Cannot interact with object designed for temporary instance passing. Make sure you using both SherlockFragmentActivity and SherlockFragment.
at com.actionbarsherlock.internal.view.menu.MenuMule.add(MenuMule.java:40)
at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:310)
at android.view.MenuInflater.parseMenu(MenuInflater.java:154)
at android.view.MenuInflater.inflate(MenuInflater.java:80)
at com.davekelley.polling.Polling.onCreateOptionsMenu(Polling.java:203)
at android.app.Activity.onCreatePanelMenu(Activity.java:2158)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:209)
at com.actionbarsherlock.app.SherlockFragmentActivity.onCreatePanelMenu(SherlockFragmentActivity.java:236)
at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:543)
at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(ActionBarSherlockCompat.java:467)
at com.actionbarsherlock.internal.ActionBarSherlockCompat.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:269)
at com.actionbarsherlock.internal.ActionBarSherlockCompat$1.run(ActionBarSherlockCompat.java:972)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android android-emulator actionbarsherlock android-menu


    【解决方案1】:

    根据这个answer,你需要添加v4 support

    【讨论】:

    • 肯定已经在使用 Compat Lib 了!我会尝试让它与这些解决方案一起使用,但我已经尝试过它们无济于事。在让菜单在旧设备上运行时,似乎与 ABS 存在一些不一致(混合标准 android 库、兼容库和 ABS 似乎相当复杂)!
    【解决方案2】:

    所以基本上为了完成这个,我不能使用 showPopup 因为那只在 API 11 及更高版本上。

    我很难让这一切在旧版本的 Android 上正常工作,至少部分是由于我不完全理解的 ActionBarSherlock 的一些不协调。我使用的哪些导入对于让应用程序在不崩溃的情况下启动非常重要,它们是:

    导入 com.actionbarsherlock.view.Menu; 进口com.actionbarsherlock.view.MenuInflater; 导入 com.actionbarsherlock.view.MenuItem;

    除此之外,我发现另一个 Stack Overflow 帖子突出显示了方法 openOptionsMenu。所以在我的片段中,我为我的 menuButton ImageView 添加了一个 onClickListener。当用户点击它时,主活动被告知 openOptionsMenu,它运行 onCreateOptionsMenu。现在 onMenuItemClick 方法似乎没有完成它的工作,但我想我明天可以很快解决这个问题。不过,现在菜单的加载方式有一个不同。它不是直接在 ImageView 顶部弹出,而是在屏幕底部加载(以旧方式或 ICS 中的新垂直菜单)。所以就是这样,但这不是一个大问题。

    我认为这几乎涵盖了它。

    代码:

        ImageView menuImg = (ImageView) activity.findViewById(R.id.menuImageView);
        menuImg.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                activity.openOptionsMenu();
            }
        });
    

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        return true;    
    }
    

    public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
            case R.id.demographics:
    
                return true;
            case R.id.settings:
                Log.v("v", "settings clicked");
                return true;
            default:
                return false;
         }
    }
    

    【讨论】:

    • 为了后代,你能描述一下你做了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多