programacion - Android: java.lang.IllegalArgumentException: tipo de elemento de carga útil no válido
manual de programacion android pdf (11)
Como lo ha dicho la gente, el error se produce cuando hay un formato en el título del artículo de menú, debido a un error de Android en la actividad cuando se escribe en el registro de eventos del sistema.
https://android-review.googlesource.com/#/c/47831/
Aunque solo lo he visto manifestado en LG hasta ahora, parece que sucederá en cualquier versión de Android antes de la corrección. Por lo que puedo decir de ese compromiso, el primer lanzamiento en el que fue etiquetado fue 4.3, pero tal vez lo esté leyendo mal.
En el menú OnMenuItemSelected de Activity, 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 forma predeterminada no se introdujeron hasta la biblioteca de soporte de v7 y estamos usando v4.
Por lo tanto, mi cambio fue anular onMenuItemSelected en una clase de actividad base y establecer el título condensado para que sea una versión de cadena del título. Esto permite que se muestre el título con formato (como con una fuente personalizada), y luego use la cadena simple para el 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 podrías hacerlo en 4.1.2, o solo para LG, pero no tengo claro por qué no se ha manifestado en otras versiones. Parece que el error podría ocurrir en otros lugares. Tal vez alguien pueda darse cuenta de cuándo se introdujo, pero no parecía haber un gran inconveniente para establecer innecesariamente una cadena adicional.
Algunos usuarios me cuentan la excepción que obtuvieron:
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 alguna idea sobre el problema? He intentado repetir esa excepción, pero no pude hacer esto. 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>
He encontrado cómo causar este error. En el menú inflado, puse un título así.
menu.setTitle(Html.fromHtml("Menu line #1<br>And what is displayed on line #2"));
Cuando use 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 use la etiqueta html para romper la línea, pero el éxito solo en la Actividad, pero falló en otra. No sé qué ha pasado. ¿Alguien tiene otra idea o solución?
Llamar a setSupportActionBar()
después de llamar a setDisplayHomeAsUp()
también parece causar este problema. Se recomienda verificar si hay varias llamadas a setSupportActionBar()
, especialmente en las clases base, si existen.
Al eliminar la llamada no deseada a setSupportActionBar()
, el problema desapareció.
Para aquellos que utilizan AppCompat
:
no puede anular Activity.onMenuItemSelected()
. Si todo lo que necesita es aplicar el formato al title
MenuItem
y no le importa el titleCondensed
: titleCondensed
:
CharSequence rawTitle = "Click here";
menuItem.setTitleCondensed(rawTitle);
SpannableString spannableTitle = new SpannableString(rawTitle);
//...whatever formatting on spannableTitle, you want
menuItem.setTitle(spannableTitle);
Para cualquiera que use la barra de herramientas con DrawerLayout en la biblioteca de soporte, este problema también puede ocurrir para ellos. Este problema se puede resolver anulando la implementación predeterminada de los clics 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.
Para mí, este error se produjo solo para una fuente personalizada SpannableString en ActionBar title / subtitle. 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 formatear mis cuerdas.
<string name="send">
<b>Send</b>
</string>
Lo cambié a
<string name="send">
Send
</string>
Espero que esto ayude.
Puede usar etiquetas CDATA también aquí hay un enlace de pregunta relacionada .
<string name="send">
<![CDATA[<b>Send</b>]]>
</string>
Gracias a Travis por señalar esto.
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 omita este registro reimplementando esta función y ¡NO LO LLAME SU SUPERIOR!
@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 elemento del menú era así:
<item android:id="@+id/item1" android:title="@string/ic_login"
android:icon="@drawable/ic_login" android:orderInCategory="100" >
</item>
Y eso no funcionó.
Lo cambio en esto:
<item android:id="@+id/item1"
android:title="Login"
android:orderInCategory="100"
android:icon="@drawable/ic_login"
/>
y eso funcionó bien.
Yo tuve el mismo problema
El problema está en Android 4.1, el elemento del menú no puede ser cadenas formadas
La cadena original en el archivo strings.xml estaba usando la etiqueta Negrita en la cadena y eso no funcionó. Luego quité la etiqueta Bold y eso 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);
}
Se trata de acciones alternativas como
para establecer una cadena en bruto, superar un lugar con errores, volver a establecer la cadena con formato original. Considero que la cadena con formato es un objeto SpannableString en este ejemplo, puede ser que uses otra cosa