Android: java.lang.IllegalArgumentException: Tipo de elemento de carga útil no válido

Algunos usuarios me dicen acerca de la excepción que tiene:

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) 

Pero no puedo entender lo que puede estar mal. ¿Alguien tiene algunas ideas sobre el problema? He intentado repetir esa excepción, pero no lo hice. Aquí está el código

 @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; } 

Con app_menu archivo 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> 

Al igual que la gente ha dicho, el error se produce cuando hay formato en el título MenuItem, debido a un error de Android en la actividad cuando se escribe en el sistema EventLog.

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

Aunque sólo he visto que se manifiesta en LG hasta ahora, parece que va a suceder en cualquier versión de Android antes de la corrección. Por lo que puedo decir de esa comisión, la liberación más temprana que fue etiquetada en fue de 4,3, pero tal vez estoy leyendo mal.

En OnMenuItemSelected de la actividad, utilizan MenuItem.getTitleCondensed () que causa el error. No utilizo el título condensado en ninguna parte, y por lo que puedo decir las vistas que lo utilizan por defecto no fueron introducidas hasta la biblioteca de soporte v7 y estamos usando v4.

Por lo tanto, mi cambio era anular onMenuItemSelected en una clase de actividad base y establecer el título condensado para ser una versión de cadena del título. Esto permite que el título formateado se muestre (como con una fuente personalizada) y, a continuación, utilice la cadena simple uno para el registro de sucesos:

 @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); } 

Probablemente usted podría hacerlo en 4.1.2, o simplemente para LG, pero no está claro para mí por qué no se ha manifestado en otras versiones. Parece que el error podría ocurrir en otro lugar. Tal vez alguien puede averiguar cuándo fue introducido, pero no parecía como mucho inconveniente para establecer innecesariamente una cadena extra.

Para aquellos que usan AppCompat :

No puede anular Activity.onMenuItemSelected() . Si todo lo que necesitas es aplicar el formato al title MenuItem y no te interesa titleCondensed :

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

Para mí este error se produjo sólo para una fuente personalizada SpannableString en ActionBar título / subtítulo. Eliminar el formato personalizado solucionó el problema.

Hack (lo siento 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)); } 

Tuve el mismo problema también. Resultó que estaba tratando de dar formato a mis cuerdas.

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

Lo cambié a:

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

Espero que esto ayude.

Usted puede utilizar etiquetas CDATA también aquí es un enlace de preguntas relacionadas .

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

Gracias a Travis por señalarlo.

Tuve el mismo problema, pero al buscar el código fuente de Android, encontré que el problema se produce al escribir un registro interno, que no puede imprimir un texto con formato.

La solución: simplemente salte este Registro reimplementando esta función y NO LLAME A SU SUPER !!

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

Yo tuve el mismo problema

El problema en Android 4.1 con elemento de menú es las cadenas

Originalmente, mi artículo del menú era como esto:

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

Y que no funcionó.

Lo cambio en esto:

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

Y que funcionó bien.

Hay una idea "no muy buena" con 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); } 

Son acciones de solución como

Para establecer una cadena sin procesar, superar un lugar buggy, establecer la cadena de formato original de nuevo. Considero que la cadena formateada es un objeto SpannableString en este ejemplo, puede ser que use otra cosa

Encontré cómo causar este error. En el menú de inflar, establezco el título como ese

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

Cuando utilizo esta configuración, causará una excepción de carga útil no válida. Entonces yo uso

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

Funciona bien como cuando conocí Android. Quiero que mi menú tenga 2 líneas, así que utilice la etiqueta html para romper la línea, pero el éxito en sólo Actividad, pero falied en otro. No sé qué pasó. ¿Alguien tiene otra idea o solución?

Para cualquiera que utilice la barra de herramientas con DrawerLayout en la biblioteca de soporte técnico, este problema puede ocurrir también para ellos. Este problema puede resolverse reemplazando la implementación de clic de navegación predeterminada.

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

Esto debería funcionar.

Yo tuve el mismo problema

El problema está en Android 4.1 el elemento de menú no puede ser cadenas formadas

La cadena original en strings.xml estaba usando etiqueta en negrita en la cadena y no funcionaba. Entonces quité la etiqueta intrépida y ésa trabajó bien.

Llamar setSupportActionBar() después de llamar a setDisplayHomeAsUp() también parece causar este problema. Se recomienda comprobar para varias llamadas setSupportActionBar() , especialmente en las clases base si existen.

Al eliminar la llamada no deseada a setSupportActionBar() , el problema desapareció.

  • Menú del mapa de externalización
  • Icono de menú que no se muestra en la barra de acción
  • Reutilizar código TextView en XML de Android
  • jquery mmenu de frebsite no funciona en orientación horizontal en móvil (android)
  • elemento del menú no se muestra como acción android.support.v7.widget.Toolbar
  • Cómo implementar valores dinámicos en el elemento de menú en Android
  • Rellenar popupmenu sin archivo XML en android
  • El menú deslizante bloquea el evento táctil en la vista superior
  • Problema con el menú de Android ActivityGroup
  • Cómo obtener un SearchView con MenuItemCompat (Android)
  • Crear un menú después de un evento de clic largo en una vista de lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.