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