Android: java.lang.IllegalArgumentException: données Invalides type d'élément

certains utilisateurs me parlent de l'exception Le got:

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)

mais je ne comprends pas ce qui peut être mal. Quelqu'un aurait-il quelques idées sur le problème? J'ai essayé de répéter cette exception, mais j'ai échoué. Voici le code

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

avec le fichier 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>
29
demandé sur ROMANIA_engineer 2011-10-05 12:44:46

11 réponses

comme les gens l'ont dit, le bug se produit quand il y a un formatage dans le titre de MenuItem, à cause d'un bug Android en activité quand il écrit sur le journal D'événements du système.

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

bien que je ne l'ai vu se manifester sur LG jusqu'à présent, il semble que cela se produira dans n'importe quelle version D'Android avant la correction. D'après ce que je peux dire de cette commission, la première libération a été il était marqué 4,3, mais je me trompe peut-être.

dans Activit's onmenuitemsélectionné, ils utilisent MenuItem.gettitl secondensed () qui provoque l'erreur. Je n'utilise le titre condensé nulle part, et pour autant que je puisse dire les vues qui l'utilisent par défaut n'ont pas été introduites jusqu'à ce que V7 supporte la bibliothèque et nous utilisons v4.

donc, mon changement était de surcharger onMenuItemSelected dans une classe D'activité de base et de mettre le titre condensé pour être une version de chaîne de la intitulé. Cela permet d'afficher le titre formaté (comme avec une police personnalisée), puis d'utiliser la chaîne simple une pour le journal d'événements:

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

probablement vous pouvez le faire en 4.1.2, ou juste pour LG, mais il n'est pas clair pour moi pourquoi il n'a pas manifesté sur d'autres versions. On dirait que le bug pourrait se produire ailleurs. Peut-être que quelqu'un peut comprendre quand il a été introduit, mais il ne semble pas y avoir beaucoup d'inconvénients à mettre inutilement une corde supplémentaire.

18
répondu Mike Venzke 2014-10-03 19:32:24

pour ceux qui utilisent AppCompat :

vous ne pouvez pas remplacer Activity.onMenuItemSelected() . Si tout ce que vous avez besoin est d'appliquer le formatage à MenuItem 's title et vous ne vous souciez pas de titleCondensed :

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

    SpannableString spannableTitle = new SpannableString(rawTitle);
    //...whatever formatting on spannableTitle, you want
    menuItem.setTitle(spannableTitle);
12
répondu riwnodennyk 2014-04-20 09:05:48

pour moi cette erreur ne s'est produite que pour une police spannablestring personnalisée dans ActionBar title / subtitle. La suppression du formatage personnalisé a résolu le problème.

Hack " (désolé 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));
}
9
répondu Mateusz Jablonski 2014-08-27 10:30:25

j'ai eu le même problème aussi. Il s'est avéré que j'essayais de formater mes cordes.

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

Je l'ai changé en:

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

j'espère que cela aidera.

vous pouvez utiliser des tags CDATA aussi voici un question link .

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

merci à Travis pour cette remarque.

7
répondu theJosh 2017-05-23 12:25:21

j'ai eu le même problème, mais en regardant le Code source Android, j'ai constaté que le problème se produit lors de l'écriture d'un journal interne, qui ne peut pas imprimer un texte formaté.

la solution: il suffit de sauter ce journal en réimplémentant cette fonction et ne pas appeler son SUPER!!

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    ... // Do your staff
    return true;
}
3
répondu Corbella 2013-04-10 13:50:52

j'ai eu le même problème

le problème dans Android 4.1 Avec L'élément de Menu est les chaînes de caractères

à l'origine, mon Menu était comme ceci:

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

et ça n'a pas marché.

je le change en ceci:

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

et ça a bien marché.

2
répondu user1245809 2012-09-27 13:06:09

il y a un "pas très bonne" idée avec 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);
}

c'est un contournement d'actions comme

pour définir une chaîne brute, surmonter un buggy place, mettre chaîne originale formatée retour. Je concider que la chaîne mise en forme est un SpannableString objet dans cet exemple, peut-être que vous pourrez utiliser quelque chose d'autre

2
répondu Mike 2015-11-27 12:33:06

j'ai trouvé comment causer cette erreur. Dans inflate menu, j'ai placé le titre comme cela

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

quand j'utilise ce paramètre, il causera une exception de charge non valide. Puis j'utilise

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

ça marche aussi bien que quand je connaissais Androïde. Je veux que mon menu ait 2 lignes, donc utilisez la balise html pour casser la ligne, mais le succès sur L'Activité seulement, mais falied sur une autre. Je ne sais pas ce qui s'est vraiment passé. Quelqu'un a une autre idée ou solution?

1
répondu khaintt 2013-01-12 04:46:06

pour toute personne utilisant la barre d'outils avec DrawerLayout sous bibliothèque de soutien, ce problème pourrait se produire pour eux aussi. Ce problème peut être résolu en écrasant l'implémentation du clic de navigation par défaut.

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

ça devrait marcher.

1
répondu razzledazzle 2015-11-03 14:43:46

j'ai eu le même problème

le problème est dans Android 4.1 L'élément de Menu ne peut pas être formaté chaînes

la corde originale dans les cordes.xml utilisait la balise Bold dans la chaîne de caractères et cela n'a pas fonctionné. Puis j'ai enlevé la balise et ça a bien marché.

0
répondu Comet 2015-04-17 08:12:35

appelant setSupportActionBar() après avoir appelé setDisplayHomeAsUp() semble aussi causer ce problème. Il est recommandé de vérifier les appels multiples setSupportActionBar() , surtout dans les classes de base si elles existent.

en supprimant l'appel non intentionnel à setSupportActionBar() , le problème a disparu.

0
répondu razzledazzle 2016-03-03 10:04:45