使用onCreateOptionsMenu()时姜饼崩溃?

时间:2012-05-08 00:46:53

标签: android android-emulator actionbarsherlock android-menu

我的应用程序在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)

2 个答案:

答案 0 :(得分:1)

根据此answer,您需要添加v4 support

答案 1 :(得分:1)

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

我试图让所有这些都在旧版本的Android上正常运行时遇到了很多麻烦,至少部分是由于我对ActionBarSherlock的一些不协调,我并不完全理解。我使用哪些导入对于让应用程序在没有崩溃的情况下启动非常重要,它们是:

import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import 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;
     }
}