pol*_*sky 29 android illegalargumentexception android-menu android-optionsmenu
有些用户告诉我有关的异常:
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)
Run Code Online (Sandbox Code Playgroud)
但我无法理解什么是错的.有没有人对这个问题有一些想法?我试图重复那个例外,但我没有做到这一点.这是代码
@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;
}
Run Code Online (Sandbox Code Playgroud)
使用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>
Run Code Online (Sandbox Code Playgroud)
Mik*_*zke 18
就像人们所说的那样,当MenuItem标题中存在格式化时会出现错误,因为当它写入系统EventLog时,Activity中存在Android错误.
https://android-review.googlesource.com/#/c/47831/
虽然到目前为止我只看到它在LG上出现,但似乎它会在修复之前的任何版本的Android中出现.据我所知,从那个提交中,最早发布的标签是4.3,但也许我读错了.
在Activity的onMenuItemSelected中,它们使用MenuItem.getTitleCondensed()来导致错误.我没有在任何地方使用精简标题,并且据我所知,默认情况下使用它的视图直到v7支持库并且我们正在使用v4时才会引入.
因此,我的更改是覆盖基类Activity类中的onMenuItemSelected,并将精简标题设置为标题的字符串版本.这样可以显示格式化的标题(就像使用自定义字体一样),然后使用普通字符串1作为事件日志:
@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);
}
Run Code Online (Sandbox Code Playgroud)
可能你可以在4.1.2中完成它,或者只是为了LG,但我不清楚为什么它没有在其他版本上显示.看起来这个bug可能发生在其他地方.也许有人可以弄清楚它什么时候被引入,但似乎没有太多的缺点来不必要地设置一个额外的字符串.
riw*_*nyk 12
对于那些使用AppCompat
:
你无法覆盖Activity.onMenuItemSelected()
.如果您只需要将格式应用于MenuItem
s title
并且您不关心titleCondensed
:
CharSequence rawTitle = "Click here";
menuItem.setTitleCondensed(rawTitle);
SpannableString spannableTitle = new SpannableString(rawTitle);
//...whatever formatting on spannableTitle, you want
menuItem.setTitle(spannableTitle);
Run Code Online (Sandbox Code Playgroud)
对我来说,只有ActionBar标题/副标题中的自定义字体SpannableString才会出现此错误.删除自定义格式解决了问题.
哈克(对不起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));
}
Run Code Online (Sandbox Code Playgroud)
我也有同样的问题.事实证明我正在尝试格式化我的字符串.
<string name="send">
<b>Send</b>
</string>
Run Code Online (Sandbox Code Playgroud)
我改成了:
<string name="send">
Send
</string>
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
你也可以使用CDATA标签这里是一个相关的问题链接.
<string name="send">
<![CDATA[<b>Send</b>]]>
</string>
Run Code Online (Sandbox Code Playgroud)
感谢Travis指出这一点.
归档时间: |
|
查看次数: |
8158 次 |
最近记录: |