29

Algunos usuarios dime acerca de la excepción de la obtuve:Android: java.lang.IllegalArgumentException: carga útil no válida elemento tipo

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 puede entender lo que puede estar equivocado. ¿Alguien tiene algunas ideas sobre el problema? Intenté 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> 
+0

En el método onMenuItemSelected() ¿cuál es el número de línea 2452? – Kerry

+23

Solo he observado esta falla en dispositivos LG con Android 4.1.2 –

+0

Solo por información: me he dado cuenta de este bloqueo en LG P710, LG E460, LG E610. Todos ellos ejecutan 4.1.2. Ridículo. – scana

Respuesta

7

que tenía el mismo problema también. Resultó que estaba tratando de formatear mis cadenas.

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

lo cambié a:

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

espero que esto ayude.

Puedes usar las etiquetas CDATA también aquí está relacionado question link.

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

Gracias a Travis por señalar esto.

+0

No puede tener html en el archivo strings.xml, a menos que esté protegido por etiquetas CDATA. – Travis

2

que tenían el mismo problema

El problema en Android 4.1 con el elemento de menú es Cuerdas

Originalmente, mi elemento de menú era así:

<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 funcionaba bien.

+0

Mi aplicación tiene alguna actividad. Funciona bien en alguien y tiene el mismo problema en otro. No sé por qué? – khaintt

1

He encontrado cómo causar este error. En el menú de inflado, puse título así

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

Cuando utilizo este ajuste, se producirá una excepción de carga útil no válida. Luego uso

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

funciona bien como cuando conozco Android. Quiero que mi menú tenga 2 líneas, así que use la etiqueta html para romper la línea, pero el éxito solo en la actividad, pero fallado en otra. No sé lo que pasó Alguien tiene otra idea o solución?

3

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

La solución: ¡simplemente saltee este Log al volver a implementar esta función y NO LLAME A SUPER!

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

Mis actividades extienden 'android.support.v7.app.ActionBarActivity' y ese método no puede ser anulado porque es' final' ... :( –

+0

me funciona, anula el método deMenuItemSelected – Lokesh

11

Para aquellos que utilizan AppCompat:

no se puede anular Activity.onMenuItemSelected(). Si todo lo que necesita es aplicar formato a MenuItem 's title y que no se preocupan por titleCondensed:

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

    SpannableString spannableTitle = new SpannableString(rawTitle); 
    //...whatever formatting on spannableTitle, you want 
    menuItem.setTitle(spannableTitle); 
8

Para mí este error se produjo sólo por un SpannableString fuente personalizada en la Barra de acciones de título/subtítulo. La eliminación del formato personalizado resolvió 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)); 
} 
+0

Hola Mateusz, me estoy poniendo el mismo error (siempre en dispositivos LG) y tenemos un título de barra de acción con estilo. Una pregunta: ¿Recibió el mismo error? Porque el seguimiento de la pila parece apuntar al menú, no al título de la barra de acciones. Si también tiene un error al decir 'onMenuItemSelected' entonces probablemente estamos experimentando lo mismo que tú. ¡Gracias! –

+0

Sí, el mismo error. Hasta donde recuerdo, ocurrió solo en dispositivos LG con 4.1 y también tengo informes con el menú no ActionBar. en mi respuesta editada para ver hackear la prevención de este error. –

+1

Gracias por esa idea. Tenga en cuenta que su hack se activará en todos los dispositivos LG, incluido Nexus 5 y otros ... Tal vez también podríamos agregar la condición ion 'Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN' para activar el hack solo en Android 4.1. –

16

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

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

Aunque sólo he visto que se manifieste en LG hasta ahora, parece que va a pasar en cualquier versión de Android antes de la corrección. Por lo que puedo decir de esa confirmación, la versión más antigua en la que fue etiquetada fue 4.3, pero tal vez estoy leyendo mal.

En Activity onMenuItemSelected, usan MenuItem.getTitleCondensed() que causa el error. No uso el título condensado en ninguna parte y, por lo que puedo decir, las vistas que lo usan de manera predeterminada no se introdujeron hasta que la biblioteca de soporte v7 y estamos usando v4.

Por lo tanto, mi cambio fue anular onMenuItemSelected en una clase de actividad base y configurar el título condensado para que sea una versión de cadena del título. De este modo, el título se mostrará con formato (como con una fuente personalizada), y luego usar la cadena llanura uno para registro de eventos:

@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 sólo podría hacerlo en 4.1.2, o simplemente para LG, pero no me queda claro por qué no se ha manifestado en otras versiones. Parece que el error podría ocurrir en otro lugar. Tal vez alguien pueda descifrar cuándo fue presentado, pero no parecía tener muchas desventajas al configurar innecesariamente una cuerda adicional.

+1

Gracias por esta solución. Sin embargo, tenga en cuenta que ActionMenuItem pasado a este método puede violar el contrato de MenuItem para getTitleCondensed(), es decir, puede devolver nulo. Consulte la fuente de Android aquí: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/com/android/internal/view/menu/ActionMenuItem. java # ActionMenuItem.getTitleCondensed% 28% 29 – gnuf

+0

sí, lo que @gnuf dijo. Ya puse esa corrección en mi código después de presionarlo, actualizaré la respuesta. –

0

que tenían el mismo problema

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

La cadena original en el strings.xml estaba usando la etiqueta en negrilla en la cadena y que didn no funciona Luego eliminé la etiqueta Negrita y funcionó bien.

1

Para cualquier persona que use la barra de herramientas con DrawerLayout en la Biblioteca de soporte técnico, este problema puede ocurrir también para ellos. Este problema se puede resolver anulando la implementación predeterminada de clic de navegación.

@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.

2

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

Es acciones de solución como

para establecer una cadena de texto, se sobrepuso a un lugar con errores, establecer cadena con formato original de nuevo. I concider cadena con formato que es un objetoSpannableString en este ejemplo, puede ser que vamos a usar algo más

0

Calling setSupportActionBar() después de llamar a setDisplayHomeAsUp() También parece causar este problema. Se recomienda verificar múltiples llamadas setSupportActionBar(), especialmente en las clases base si existen.

Al eliminar la llamada involuntaria al setSupportActionBar(), el problema desapareció.

Cuestiones relacionadas