夏洛克操作栏菜单

3
我正在尝试以编程方式设置菜单,并将方法中的com.actionbarsherlock.view.Menu menu作为参数传递。因为我想要更改菜单项的样式,所以我正在尝试设置一个SpannableString spannable并将其传递给add函数。 menu.add(0, MENU_ABOUT, 0, spannable); 当我点击该菜单项时,这会导致ICS崩溃。请问是否有遗漏的地方。谢谢。 以下是我尝试的代码。当我运行应用程序并选择“关于应用程序”时,它会崩溃。FYI,我正在使用SpannableString,因为我想要向菜单项添加一些样式和颜色。如果我使用普通的字符串,则不会发生崩溃,但是我无法进行样式设置。
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu)
{
    SpannableString spannable = new SpannableString("About Application");
    menu.add(0, MENU_ABOUT, 0, spannable);
    return true;
}

以下是堆栈跟踪信息:

    09-05 02:25:32.849: E/AndroidRuntime(684): FATAL EXCEPTION: main
    09-05 02:25:32.849: E/AndroidRuntime(684): java.lang.IllegalArgumentException:  Invalid payload item type
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.util.EventLog.writeEvent(Native Method)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.app.Activity.onMenuItemSelected(Activity.java:2501)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:351)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:950)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:163)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.widget.AdapterView.performItemClick(AdapterView.java:292)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3180)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.View.dispatchTouchEvent(View.java:5541)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1951)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1860)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.View.dispatchPointerEvent(View.java:5721)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2890)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2466)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2475)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.os.Handler.dispatchMessage(Handler.java:99)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.os.Looper.loop(Looper.java:137)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at android.app.ActivityThread.main(ActivityThread.java:4424)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at java.lang.reflect.Method.invokeNative(Native Method)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at java.lang.reflect.Method.invoke(Method.java:511)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    09-05 02:25:32.849: E/AndroidRuntime(684):  at dalvik.system.NativeStart.main(Native Method)

谢谢。

1
如果@StrikeForceZero的建议被删除,请发布您正在使用的堆栈跟踪和源代码。如果可能,请指向此崩溃发生的代码行。 - Cat
1个回答

1

您能否发布堆栈跟踪和可能的源代码? (我想把这个作为评论,但是我在发布时没有50个声望)

瞎猜一下... 您可能正在调用getMenuInflater(),而应该调用getSupportMenuInflater()

/编辑

尝试复制您的错误后,我注意到样式化ActionBar的ActionButton文本似乎不可行。即使不使用Sherlock库。在运行低于API 11的设备上,不会抛出错误,但按钮也不会被样式化。

您可能需要创建一个带有样式的静态xml文件,就像答案建议的那样下面的一个(只是一个想法)


感谢Strike,如果您没有添加额外的代码,按钮就不会被样式化。我的担忧是崩溃问题。所以结论是在Android版本小于ICS时它能够运行,但在ICS中有一个导致崩溃的bug? - user1647443
1
可能是的,在API 11及以上版本(蜂巢)中存在一个bug。但我认为你无法对其进行样式设置的原因是我添加了spannable.setSpan(new ForegroundColorSpan(Color.RED), 0, spannable.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);,但在任何版本上都没有看到任何样式被执行。 - StrikeForceZero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接