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>
Ответы
Ответ 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()
проблема исчезла.