Android:java.lang.IllegalArgumentException:无效负载项types

有些用户告诉我这个例外:

java.lang.IllegalArgumentException: Invalid payload item type at android.util.EventLog.writeEvent(Native Method) at android.app.Activity.onMenuItemSelected(Activity.java:2452) at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:846) at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153) at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:956) at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:534) at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) at android.view.View$PerformClick.run(View.java:11934) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:132) at android.app.ActivityThread.main(ActivityThread.java:4123) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:491) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) at dalvik.system.NativeStart.main(Native Method) 

但我不明白什么是错的。 有没有人有关于这个问题的一些想法? 我试图重复这个例外,但我没有做到这一点。 这是代码

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.app_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.about: startActivity(new Intent(this, AboutActivity.class)); return true; case R.id.settings: startActivity(new Intent(this, SettingsActivity.class)); return true; case R.id.help: startActivity(new Intent(this, AboutActivity.class)); return true; } return true; } 

用app_menu xlm文件:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/about" android:icon="@android:drawable/ic_menu_info_details" android:title="@string/about_menu_item"/> <item android:id="@+id/settings" android:icon="@android:drawable/ic_menu_preferences" android:title="@string/settings_menu_item"/> </menu> 

Solutions Collecting From Web of "Android:java.lang.IllegalArgumentException:无效负载项types"

就像人们所说的那样,当MenuItem标题中有格式化时,就会出现这个错误,这是因为在写入系统事件日志时,由于Activity中的Android错误。

https://android-review.googlesource.com/#/c/47831/

尽pipe目前为止我只看到了它在LG上的显示,但在修复之前,似乎会在任何Android版本中发生。 据我所知,这个提交的最早版本是4.3,但也许我读错了。

在Activity的onMenuItemSelected中,它们使用导致错误的MenuItem.getTitleCondensed()。 我不会在任何地方使用浓缩的标题,并且据我所知,默认情况下使用它的视图在v7支持库和我们正在使用v4之前不会被引入。

所以,我的更改是重写基本Activity类中的onMenuItemSelected,并将浓缩标题设置为标题的string版本。 这样可以显示格式化标题(如使用自定义字体),然后使用普通string作为事件日志:

 @Override public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { // fix android formatted title bug if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2 && item.getTitleCondensed() != null) { item.setTitleCondensed(item.getTitleCondensed().toString()); } return super.onMenuItemSelected(featureId, item); } 

也许你可以在4.1.2中做,或者只是为了LG,但是我不清楚为什么它没有在其他版本上显示。 看起来这个错误可能发生在其他地方。 也许有人可以弄清楚它是什么时候推出的,但是不必要的设置一个额外的string似乎没有太大的不利之处。

对于那些使用AppCompat

你不能重写Activity.onMenuItemSelected() 。 如果你只需要将格式应用于MenuItemtitle ,而不关心titleCondensed

  CharSequence rawTitle = "Click here"; menuItem.setTitleCondensed(rawTitle); SpannableString spannableTitle = new SpannableString(rawTitle); //...whatever formatting on spannableTitle, you want menuItem.setTitle(spannableTitle); 

对我来说,这个错误只发生在ActionBar标题/副标题中的自定义字体SpannableString。 删除自定义格式解决了这个问题。

哈克(对不起LG ;-):

 public static void setActionBarTitle(ActionBarActivity a, String s) { SpannableString ss = new SpannableString(s); ss.setSpan(new TypefaceSpan(a, "Roboto-Light.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ActionBar actionBar = a.getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(true); actionBar.setLogo(R.drawable.icon); actionBar.setTitle(isManufacturer("LG") ? s : ss); } public static boolean isManufacturer(String company) { String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; return (manufacturer.contains(company) || model.contains(company)); } 

我也有同样的问题。 事实certificate,我试图格式化我的string。

  <string name="send"> <b>Send</b> </string> 

我把它改成:

  <string name="send"> Send </string> 

我希望这有帮助。

你也可以使用CDATA标签,这里也是一个相关的问题链接 。

  <string name="send"> <![CDATA[<b>Send</b>]]> </string> 

感谢Travis指出这一点。

我有同样的问题,但看看Android的源代码,我发现写一个内部的日志,不能打印格式化文本时发生的问题。

解决scheme:通过重新实现这个function简单地跳过这个日志,不要打它的超级!

 @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { ... // Do your staff return true; } 

我有同样的问题

在菜单项Android 4.1中的问题是string

最初,我的菜单项是这样的:

 <item android:id="@+id/item1" android:title="@string/ic_login" android:icon="@drawable/ic_login" android:orderInCategory="100" > </item> 

那没有用。

我把它改成这样:

 <item android:id="@+id/item1" android:title="Login" android:orderInCategory="100" android:icon="@drawable/ic_login" /> 

那效果很好。

有一个“不是很好”的想法onMenuItemSelected(…)

  @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { if (item.getTitle() instanceof SpannableString) { SpannableString sp = (SpannableString)item.getTitle(); Object[] spans = sp.getSpans(0, sp.length(), Object.class); if (spans != null && spans.length > 0) { // set text without span markups, need for super.onMenuItemSelected(featureId, item); item.setTitleCondensed(sp.toString()); boolean result = super.onMenuItemSelected(featureId, item); item.setTitleCondensed(sp); return result; } } return super.onMenuItemSelected(featureId, item); } 

这是类似的解决方法

设置一个原始string,克服一个马车的地方,设置原始格式化的string回来。 我concider格式化的string是一个SpannableString对象在这个例子中,可能你会用别的东西

我发现如何导致这个错误。 在充气菜单中,我设置了这样的标题

 menu.setTitle(Html.fromHtml("Menu line #1<br>And what is displayed on line #2")); 

当我使用这个设置时,会导致无效负载exception。 然后我用

 menu.setTitle("Menu line #1. Opps, can not set what is displayed on line #2"); 

它正常工作,因为当我知道Android。 我想我的菜单有2行,所以使用HTML标签来打破行,但成功只有活动,但在另一个失败。 我不知道发生了什么。 任何人有另一个想法或解决scheme

对于任何人在支持库下使用DrawerLayout的工具栏,也可能出现这个问题。 这个问题可以通过覆盖默认的导航点击实现来解决。

 @Override public void setSupportActionBar(Toolbar toolbar) { super.setSupportActionBar(toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { openDrawer(); } }); } 

这应该工作。

我有同样的问题

问题出在Android 4.1的菜单项不能被格式化的string

strings.xml中的原始string在string中使用了Bold标记,并且不起作用。 然后我删除了Bold标签,并且运行良好。

调用setSupportActionBar()之后调用setSupportActionBar()也会导致此问题。 build议检查多个setSupportActionBar()调用,特别是在基类中(如果存在的话)。

在删除意外的调用setSupportActionBar() ,问题就消失了。