29

一部のユーザーは、得られた例外について教えてくれます:

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

11 に答える 11

18

人々が言っ​​たように、システム EventLog に書き込むときの Activity の Android バグが原因で、MenuItem タイトルにフォーマットがあるとバグが発生します。

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

これまでのところ LG でしか発生していませんが、修正前の Android のどのバージョンでも発生するようです。そのコミットからわかる限り、タグ付けされた最初のリリースは 4.3 でしたが、私の読み方が間違っているのかもしれません。

アクティビティの onMenuItemSelected では、エラーの原因となる MenuItem.getTitleCondensed() を使用しています。私は要約されたタイトルをどこにも使用していません。私が知る限り、デフォルトでそれを使用するビューは、v7 サポート ライブラリまで導入されず、v4 を使用しています。

したがって、私の変更は、基本 Activity クラスで onMenuItemSelected をオーバーライドし、要約されたタイトルをタイトルの文字列バージョンに設定することでした。これにより、フォーマットされたタイトルが (カスタム フォントのように) 表示され、イベント ログにプレーン文字列が使用されます。

@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 でのみ実行できますが、他のバージョンで明らかにならない理由は明らかではありません。バグは他の場所で発生する可能性があるようです。誰かがいつ導入されたかを理解できるかもしれませんが、余分な文字列を不必要に設定することによるマイナス面はあまりないように思えました.

于 2014-09-04T20:22:28.193 に答える
12

を使用している場合AppCompat:

上書きすることはできませんActivity.onMenuItemSelected()。にフォーマットを適用するだけでMenuItemtitleを気にしない場合titleCondensed:

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

    SpannableString spannableTitle = new SpannableString(rawTitle);
    //...whatever formatting on spannableTitle, you want
    menuItem.setTitle(spannableTitle);
于 2014-02-21T13:51:45.840 に答える
9

私にとって、このエラーは、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));
}
于 2014-05-23T08:13:17.487 に答える
7

私も同じ問題を抱えていました。文字列をフォーマットしようとしていたことが判明しました。

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

私はそれを次のように変更しました:

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

これが役立つことを願っています。

CDATA タグも使用できます。関連する質問のリンクもここにあります。

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

これを指摘してくれたTravisに感謝します。

于 2011-10-14T23:06:12.000 に答える
2

私は同じ問題を抱えていました

メニュー項目を含む 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"
/>

そしてそれはうまくいきました。

于 2012-08-01T15:05:03.093 に答える
2

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オブジェクトであると考えています。別のものを使用する可能性があります

于 2015-11-27T12:33:06.597 に答える
1

このエラーの原因を見つけました。インフレートメニューで、そのようなタイトルを設定しました

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 のみで成功し、別の行では失敗しました。何が起こったのかわかりません。誰にも別のアイデアや解決策がありますか?

于 2013-01-12T04:46:06.287 に答える
1

サポート ライブラリの DrawerLayout でツールバーを使用している場合、この問題が発生する可能性があります。この問題は、デフォルトのナビゲーション クリックの実装をオーバーライドすることで解決できます。

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

これはうまくいくはずです。

于 2015-11-03T14:43:46.163 に答える
0

電話をかけsetSupportActionBar()た後に電話をかけることsetDisplayHomeAsUp()も、この問題を引き起こすようです。複数のsetSupportActionBar()呼び出しが存在する場合は、特に基本クラスで確認することをお勧めします。

への意図しない呼び出しを削除するsetSupportActionBar()と、問題はなくなりました。

于 2016-03-03T10:04:45.137 に答える