Android:java.lang.IllegalArgumentException:无效的有效内容项类型

pol*_*sky 29 android illegalargumentexception android-menu android-optionsmenu

有些用户告诉我有关的异常:

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)
Run Code Online (Sandbox Code Playgroud)

但我无法理解什么是错的.有没有人对这个问题有一些想法?我试图重复那个例外,但我没有做到这一点.这是代码

@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;
} 
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

Mik*_*zke 18

就像人们所说的那样,当MenuItem标题中存在格式化时会出现错误,因为当它写入系统EventLog时,Activity中存在Android错误.

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

虽然到目前为止我只看到它在LG上出现,但似乎它会在修复之前的任何版本的Android中出现.据我所知,从那个提交中,最早发布的标签是4.3,但也许我读错了.

在Activity的onMenuItemSelected中,它们使用MenuItem.getTitleCondensed()来导致错误.我没有在任何地方使用精简标题,并且据我所知,默认情况下使用它的视图直到v7支持库并且我们正在使用v4时才会引入.

因此,我的更改是覆盖基类Activity类中的onMenuItemSelected,并将精简标题设置为标题的字符串版本.这样可以显示格式化的标题(就像使用自定义字体一样),然后使用普通字符串1作为事件日志:

@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);
}
Run Code Online (Sandbox Code Playgroud)

可能你可以在4.1.2中完成它,或者只是为了LG,但我不清楚为什么它没有在其他版本上显示.看起来这个bug可能发生在其他地方.也许有人可以弄清楚它什么时候被引入,但似乎没有太多的缺点来不必要地设置一个额外的字符串.


riw*_*nyk 12

对于那些使用AppCompat:

你无法覆盖Activity.onMenuItemSelected().如果您只需要将格式应用于MenuItems title并且您不关心titleCondensed:

    CharSequence rawTitle = "Click here";
    menuItem.setTitleCondensed(rawTitle);

    SpannableString spannableTitle = new SpannableString(rawTitle);
    //...whatever formatting on spannableTitle, you want
    menuItem.setTitle(spannableTitle);
Run Code Online (Sandbox Code Playgroud)


Mat*_*ski 9

对我来说,只有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));
}
Run Code Online (Sandbox Code Playgroud)


the*_*osh 7

我也有同样的问题.事实证明我正在尝试格式化我的字符串.

    <string name="send">
        <b>Send</b>
    </string>
Run Code Online (Sandbox Code Playgroud)

我改成了:

    <string name="send">
        Send
    </string>
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

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

        <string name="send">
             <![CDATA[<b>Send</b>]]>
        </string>
Run Code Online (Sandbox Code Playgroud)

感谢Travis指出这一点.