29

Alcuni utenti parlami eccezione GOT:Android: java.lang.IllegalArgumentException: payload non valido 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) 

Ma non riesco a capire che cosa può essere sbagliato. Qualcuno ha qualche idea sul problema? Ho provato a ripetere quell'eccezione, ma non sono riuscito a farlo. Ecco il codice

@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 di file 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

Nel metodo onMenuItemSelected() che è il numero di riga 2452? – Kerry

+23

Ho notato questo crash su dispositivi LG con Android 4.1.2 –

+0

Solo per informazioni: ho notato questo crash su LG P710, LG E460, LG E610. Tutti sono in esecuzione 4.1.2. Ridicolo. – scana

risposta

7

Ho avuto lo stesso problema troppo. Si è scoperto che stavo cercando di formattare le mie corde.

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

ho cambiato in:

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

Spero che questo aiuta.

È possibile utilizzare i tag CDATA anche qui è un relativo question link.

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

Grazie a Travis per averlo indicato.

+0

Non è possibile avere html nel file strings.xml, a meno che non sia protetto dai tag CDATA. – Travis

2

Ho avuto lo stesso problema

Il problema in Android 4.1 con la voce di menu è lo Strings

In origine, la mia voce di menu era come questo:

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

e che non ha funzionato .

posso cambiare in questo modo:

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

e che ha funzionato bene.

+0

La mia app ha qualche attività. Funziona bene su qualcuno e ha lo stesso problema su un altro. Non so perché? – khaintt

1

Ho trovato come causare questo errore. Nel menu di gonfiare, ho impostato titolo del genere

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

Quando uso questa impostazione, causerà un'eccezione payload non valido. Quindi io uso

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

funziona bene come quando ho conosciuto Android. Voglio che il mio menu abbia 2 righe, quindi usa il tag html per interrompere la linea, ma il successo è solo su Activity, ma è su un altro. Non so cosa sia successo. Qualcuno ha un'altra idea o soluzione?

3

Ho avuto lo stesso problema, ma guardando il codice sorgente Android, ho scoperto che il problema si verifica quando si scrive un registro interno, che non può stampare un testo formattato.

La soluzione: è sufficiente saltare questo registro reimplementando questa funzione e NON CHIAMARE IL SUO SUPER !!

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

Le mie attività estendono 'android.support.v7.app.ActionBarActivity' e questo metodo non può essere sovrascritto perché è' final' ... :( –

+0

funziona per me, sostituisce onMenuItem Metodo selezionato – Lokesh

11

Per coloro che utilizzano AppCompat:

non è possibile ignorare Activity.onMenuItemSelected(). Se tutto ciò che serve è quello di applicare la formattazione a MenuItem s' title e non si preoccupano di titleCondensed:

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

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

Per me questo errore si è verificato solo per un tipo di carattere personalizzato in SpannableString ActionBar titolo/sottotitolo. La rimozione della formattazione personalizzata ha risolto il problema.

Hack (scusate 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

Ciao Mateusz, sto ricevendo lo stesso errore (sempre sui dispositivi LG) e abbiamo un titolo della barra delle azioni in stile Una domanda: hai ricevuto lo stesso errore? Perché la traccia dello stack sembra puntare al menu, non il titolo della barra delle azioni. errore dicendo "onMenuItemSelected' quindi probabilmente stiamo vivendo lo stesso di te. Grazie! –

+0

Sì, lo stesso errore. Per quanto posso ricordare si è verificato solo su dispositivi LG con 4.1 e ho anche rapporti con menu non ActionBar. alla mia risposta modificata per vedere l'hack che impedisce questo errore –

+1

Grazie per questa idea. Tieni presente che il tuo hack verrà attivato su tutti i dispositivi LG, inclusi Nexus 5 e altri ... Forse potremmo anche aggiungere il condit ione 'Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN' per attivare l'hack solo su Android 4.1. –

16

Come è già stato detto, il bug si verifica quando c'è la formattazione nel titolo MenuItem, a causa di un bug di Android in attività quando si scrive al sistema EventLog.

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

Anche se ho visto solo si manifesta su LG finora, sembra che accadrà in qualsiasi versione di Android prima della correzione. Per quanto posso dire da quel commit, il primo rilascio in cui è stato taggato era 4.3, ma forse sto leggendo male.

In Activity onMenuItemSelected, utilizzano MenuItem.getTitleCondensed() che causa l'errore. Non uso il titolo condensato da nessuna parte, e per quanto posso dire le viste che lo utilizzano di default non sono state introdotte fino alla libreria di supporto v7 e stiamo usando v4.

Quindi, la mia modifica era quella di sovrascrivere onMenuItemSelected in una classe Activity di base e impostare il titolo condensato come una versione stringa del titolo. In questo modo il titolo formattato essere visualizzato (come con un carattere personalizzato), e quindi utilizzare la stringa piana di registro eventi:

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

Probabilmente si può solo farlo in 4.1.2, o semplicemente per LG, ma non mi è chiaro perché non si sia manifestato su altre versioni. Sembra che il bug potrebbe accadere altrove. Forse qualcuno può capire quando è stato presentato, ma non sembra che abbiate molto svantaggi nell'impostare inutilmente una stringa in più.

+1

Grazie per questa soluzione alternativa. Fate attenzione, tuttavia, che ActionMenuItem passato a questo metodo potrebbe violare il contratto MenuItem per getTitleCondensed(), cioè potrebbe restituire null. Vedi la fonte Android qui: 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ì, cosa ha detto @gnuf. Ho già messo quella correzione nel mio codice dopo averlo colpito - aggiornerò la risposta. –

0

Ho avuto lo stesso problema

Il problema è in Android 4.1 la voce di menu non può essere formattato stringhe

La stringa originale nella strings.xml stava usando tag grassetto nella stringa e che didn lavorare Quindi ho rimosso il tag Bold e questo ha funzionato bene.

1

Per chiunque utilizzi la barra degli strumenti con DrawerLayout in Libreria di supporto, questo problema potrebbe verificarsi anche per loro. Questo problema può essere risolto sovrascrivendo l'implementazione di clic di spostamento predefinita.

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

Questo dovrebbe funzionare.

2

c'è un'idea "non molto buona" 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); 
} 

E 'azioni di soluzione come

per impostare una stringa grezzo, ha superato un posto buggy, impostare stringa formattata originale indietro. ho considerate questo che stringa formattata è un SpannableString oggetto in questo esempio, può essere potrai utilizzare qualcos'altro

0

Calling setSupportActionBar() dopo aver chiamato setDisplayHomeAsUp() sembra anche causare questo problema. Si consiglia di verificare più chiamate setSupportActionBar(), in particolare nelle classi base, se esistenti.

Dopo aver eliminato la chiamata non desiderata a setSupportActionBar(), il problema è andato via.