web-dev-qa-db-ja.com

ActionBarオーバーフローメニューにアイコンを表示する方法

オーバーフロードロップダウンメニューのメニュー項目のタイトルに加えてアイコンを表示したい。

可能ですか?

23
Alexey Zakharov

プロパティAndroid:showAsAction="always"を使用してメニューを配置し、メニューのxmlファイルにサブメニューを追加します

<item
        Android:id="@+id/mainMenu"
        Android:icon="@drawable/launcher"
        Android:showAsAction="always">
        <menu>

            <item
                Android:id="@+id/menu_logout"
                Android:icon="@drawable/log_out"
                Android:title="logout"/>
        </menu>
    </item>

これはメニューにアイコンを表示します

33
androido

多分あなたは私と同じ問題を抱えています。したがって、AppCompatを使用している場合は、このプロパティを使用しないでください。

Android:showAsAction="always"

代わりに次のように使用します。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item
        Android:id="@+id/option"
        Android:title="@string/option"
        Android:icon="@drawable/option"
        app:showAsAction="always">
    </item>
</menu> 

追加のxmlns:appshowAsActionappのプロパティに違いがあります。

それが誰かを助けることを願っています。

4
HugoMasterPL

実際に表示するのは実際にはTextViewなので、実際には簡単な方法があります。たとえば、次のようにspanを設定します。

final MenuItem menuItem=...
final ImageSpan imageSpan=new ImageSpan(this,R.drawable.ic_stat_app_icon);
final CharSequence title=" "+menuItem.getTitle();
final SpannableString spannableString=new SpannableString(title);
spannableString.setSpan(imageSpan,0,1,0);
menuItem.setTitle(spannableString);

これにより、メニュー項目の最初、元のテキストの直前にアイコンが配置されます。

4

このような答えは嫌いですが、私はより良い答えを出すには十分ではありません。

メニューのオーバーフローアイテムのアイコンは、submenu2の行 "subMenu2Item.setIcon(R.drawable.ic_launcher);"です。 ic_launcherをアイコンファイル(プログラムのresドローアブルディレクトリ内)に置き換えるだけです。 ActionBarSherlockを使用していることを願っています。

行subMenu1Item.setIcon(R.drawable.ic_launcher);上部のメニューボタンのActionBarアイコン用です。

「これは設計では不可能」への対応

世界を乗っ取ってコートテールに乗らせてくれたGoogleに感謝しますが、Googleは一貫性がないので、一貫性に欠けています。 Googleが提供するすべてのAPIの「セット」の例を作成できたらいいですね。コードへのAPI参照はありますが、それらを組み合わせる方法の例はありません。APKとして実行できる完全に機能する例はすべて私が望んでいます。私はそこからだまし取ることができます。 APKを作成するのに時間がかかる場合、標準テンプレートで小さな例をコーディングするのはどれほど難しいでしょうか?すべての30%について、要求することは多くありません。私も当時、Microsoftと同じ議論をしていましたが、それも起こりませんでした。したがって、スタックオーバーフローが発生します。 :)残念なことに、Googleがそのばかげたアクションバーパッチを思い付くよりも、下位互換性のあるアクションバーを使って自分で作業する人(ジェイクウォートンのロック)が必要です。

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {

    SubMenu subMenu1 = menu.addSubMenu("Action Item");
    subMenu1.add("Help");
    subMenu1.add("About");

    MenuItem subMenu1Item = subMenu1.getItem();
    subMenu1Item.setIcon(R.drawable.ic_launcher);
    subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

    SubMenu subMenu2 = menu.addSubMenu("All Options");
    subMenu2.add("Help");
    subMenu2.add("About");

    MenuItem subMenu2Item = subMenu2.getItem();
    subMenu2Item.setIcon(R.drawable.ic_launcher);

    return super.onCreateOptionsMenu(menu);
}
2
tester
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
    if(featureId == Window.FEATURE_ACTION_BAR && menu != null){
        if(menu.getClass().getSimpleName().equals("MenuBuilder")){
            try{
                Method m = menu.getClass().getDeclaredMethod(
                    "setOptionalIconsVisible", Boolean.TYPE);
                m.setAccessible(true);
                m.invoke(menu, true);
            }
            catch(NoSuchMethodException e){
                Log.e(TAG, "onMenuOpened", e);
            }
            catch(Exception e){
                throw new RuntimeException(e);
            }
        }
    }
    return super.onMenuOpened(featureId, menu);
}

参照: ActionBarのオーバーフローメニューにアイコンを表示する方法

2
Abhinav

これは設計では不可能です(少なくともHCでは-API 16で開発していて、アイコンも取得していません)。 Googleはそれを望まない。

トピックに関する少しの議論については、ここで関連する回答を参照してください:

コメントの1つが示唆しているように、アイコンが必要な場合は、オーバーフローメニューではなくドロップダウンメニューの使用を検討してください。

1