オーバーフロードロップダウンメニューのメニュー項目のタイトルに加えてアイコンを表示したい。
可能ですか?
プロパティ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>
これはメニューにアイコンを表示します
多分あなたは私と同じ問題を抱えています。したがって、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:appとshowAsActionはappのプロパティに違いがあります。
それが誰かを助けることを願っています。
実際に表示するのは実際には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);
これにより、メニュー項目の最初、元のテキストの直前にアイコンが配置されます。
このような答えは嫌いですが、私はより良い答えを出すには十分ではありません。
メニューのオーバーフローアイテムのアイコンは、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);
}
@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);
}
これは設計では不可能です(少なくともHCでは-API 16で開発していて、アイコンも取得していません)。 Googleはそれを望まない。
トピックに関する少しの議論については、ここで関連する回答を参照してください:
コメントの1つが示唆しているように、アイコンが必要な場合は、オーバーフローメニューではなくドロップダウンメニューの使用を検討してください。