Подтвердить что ты не робот

Android: java.lang.IllegalArgumentException: недопустимый тип элемента полезной нагрузки

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

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>
4b9b3361

Ответ 1

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

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

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

В Activity onMenuItemSelected они используют 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, но мне непонятно, почему он не проявился в других версиях. Похоже, что ошибка может произойти в другом месте. Может быть, кто-то может понять, когда это было введено, но не было похоже на недостаток, чтобы ненужно установить дополнительную строку.

Ответ 2

Для тех, кто использует 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);

Ответ 3

Для меня эта ошибка произошла только для пользовательского шрифта 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));
}

Ответ 4

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

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

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

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

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

Вы можете использовать теги CDATA, а также связанную ссылку .

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

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

Ответ 5

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

Решение: просто пропустите этот журнал, переопределив эту функцию и НЕ НАЗЫВАЙТЕ ЕГО СУПЕР!!

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

Ответ 6

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

Проблема в 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"
/>

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

Ответ 7

есть идея "не очень хорошая" с 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 объектом в этом примере, возможно, вы будете использовать что-то еще

Ответ 8

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

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, но falied на другом. Я не знаю, что случилось. У кого-нибудь есть другая идея или решение?

Ответ 9

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

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

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

Ответ 10

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

Проблема в Android 4.1: элемент меню не может быть сформирован.

Исходная строка в файле strings.xml использовала тег Bold в строке, и это не сработало. Затем я удалил ярлык Bold и работал хорошо.

Ответ 11

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

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