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
- Cómo hacer clic en el índice en el menú de opciones con Espresso Android
- Android ICS: Cómo detectar que un dispositivo tiene "en la pantalla Volver / botón Inicio" (como Galaxy Nexus)
- Cómo utilizar onActivityResult (..) si la actividad se llama desde un menú
- Cómo cambiar el color de fondo del menú de ActionBar (android 4 y 5)
- ¿por qué el botón de menú del emulador muestra todas las actividades de mi aplicación?
@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>
- La lista de menús sale de la pantalla cuando anyDensity = "false"
- Menú Ordenando las diferencias debido a la jerarquía Fragmento y Actividad. (OnCreateOptionsMenu)
- Menú de tipo ListView anidado de forma arbitraria de Android
- Actividad de inicio de Android en la selección del elemento de menú
- Implementación de tres acciones dentro de una única opción de menú en Android
- Cómo mostrar la lista de iconos con texto en el menú de acción de Android como imagen
- El menú de opciones de Android no se muestra
- Android actionLayout no se muestra con la barra de herramientas
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ó.
- OnScroll se llama cuando establezco listView.onScrollListener (este), pero sin ningún toque
- ExpandableListView Group View Expand Predeterminado