Android: java.lang.IllegalArgumentException: недопустимый тип элемента полезной нагрузки - PullRequest
29 голосов
/ 05 октября 2011

Некоторые пользователи говорят мне об исключении:

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)

Но я не могу понять, что может быть не так.У кого-нибудь есть идеи по поводу проблемы?Я пытался повторить это исключение, но мне не удалось это сделать.Вот код

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

с файлом 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>

Ответы [ 11 ]

18 голосов
/ 05 сентября 2014

Как уже говорили, ошибка возникает при форматировании в заголовке MenuItem из-за ошибки Android в Activity при записи в систему EventLog.

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

Хотя до сих пор я видел это только на LG, похоже, что это произойдет в любой версии Android до исправления.Насколько я могу судить из этого коммита, самая ранняя версия, на которой он был помечен, была 4.3, но, возможно, я читаю это неправильно.

В onMenuItemSelected в Activity они используют MenuItem.getTitleCondensed (), что вызывает ошибку,Я нигде не использую сокращенный заголовок, и, насколько я могу судить, представления, использующие его по умолчанию, не были представлены до тех пор, пока v7 не поддерживает библиотеку, а мы не используем v4.

Итак, мое изменение былопереопределить onMenuItemSelected в базовом классе Activity и установить сжатый заголовок как строковую версию заголовка.Это позволяет отображать отформатированный заголовок (как с пользовательским шрифтом), а затем использовать простую строку для журнала событий:

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

Возможно, вы могли бы просто сделать это в 4.1.2 или просто для LG, но мне не понятно, почему это не проявляется в других версиях.Похоже, ошибка может случиться в другом месте.Может быть, кто-то может выяснить, когда он был представлен, но не было особого недостатка в том, чтобы излишне устанавливать дополнительную строку.

12 голосов
/ 21 февраля 2014

Для тех, кто использует AppCompat:

, вы не можете переопределить Activity.onMenuItemSelected().Если все, что вам нужно, это применить форматирование к MenuItem title, и вас не волнует titleCondensed:

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

    SpannableString spannableTitle = new SpannableString(rawTitle);
    //...whatever formatting on spannableTitle, you want
    menuItem.setTitle(spannableTitle);
9 голосов
/ 23 мая 2014

Для меня эта ошибка произошла только для пользовательского шрифта SpannableString в заголовке / субтитре ActionBar. Удаление пользовательского форматирования решило проблему.

взломать (простите 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));
}
7 голосов
/ 15 октября 2011

У меня тоже была такая же проблема.Оказалось, что я пытался отформатировать свои строки.

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

Я изменил его на:

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

Надеюсь, это поможет.

Вы можете использовать CDATAТеги также здесь связаны ссылка на вопрос .

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

Спасибо Трэвису за указание на это.

3 голосов
/ 10 апреля 2013

У меня была та же проблема, но, глядя на исходный код Android, я обнаружил, что проблема возникает при записи внутреннего журнала, который не может печатать форматированный текст.

Решение: просто пропустите этот журналпереопределив эту функцию и не вызывая ее супер !!

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    ... // Do your staff
    return true;
}
2 голосов
/ 27 ноября 2015

есть "не очень хорошая" идея с 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);
}

Это обходные действия, такие как

, чтобы установить необработанную строку, преодолеть ошибочное место, вернуть исходную отформатированную строку обратно. Я полагаю, что отформатированная строка является SpannableString объектом в этом примере, может быть, вы будете использовать что-то еще

2 голосов
/ 01 августа 2012

У меня была такая же проблема

Проблема в Android 4.1 с пунктом меню - строки

Изначально мой пункт меню был таким:

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

и это не сработало.

Я изменяю это на это:

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

и это сработало хорошо.

1 голос
/ 03 ноября 2015

Для тех, кто использует панель инструментов с DrawerLayout из библиотеки поддержки, эта проблема может возникнуть и у них. Эту проблему можно решить, переопределив реализацию щелчка навигации по умолчанию.

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

Это должно работать.

1 голос
/ 12 января 2013

Я нашел, как вызвать эту ошибку. В меню надувания я устанавливаю заголовок вот так

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

Когда я использую этот параметр, он вызовет недопустимое исключение полезной нагрузки. Тогда я использую

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

работает нормально, когда я знал Android. Я хочу, чтобы в моем меню было 2 строки, поэтому используйте html-тег, чтобы разбить строку, но успех был только для Activity, но не совпадал с другой. Я не знаю, что случилось. У кого-нибудь есть другая идея или решение?

0 голосов
/ 03 марта 2016

Вызов setSupportActionBar() после вызова setDisplayHomeAsUp() также, кажется, вызывает эту проблему.Рекомендуется проверить наличие нескольких вызовов setSupportActionBar(), особенно в базовых классах, если они существуют.

После удаления непреднамеренного вызова на setSupportActionBar() проблема исчезла.

...