23

除了溢出下拉菜单中的菜单项标题之外,我还想显示图标。

有可能吗?

4

6 回答 6

32

将您的菜单与属性放在一起, 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>

这将在菜单中显示图标

于 2013-04-16T07:57:04.553 回答
4

其实有一个简单的方法可以实现,因为你看到的其实是一个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);

这将在菜单项的开头放置一个图标,就在其原始文本之前。

于 2014-09-02T14:57:10.983 回答
2
@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 的溢出菜单中显示图标

于 2014-08-20T11:09:35.483 回答
2

讨厌这样的答案,但我还不够好,无法给出更好的答案。

菜单溢出项的图标是 submenu2 行“subMenu2Item.setIcon(R.drawable.ic_launcher);” 只需将 ic_launcher 替换为您的图标文件(在程序的 res 可绘制目录中)。希望您的意思是使用 ActionBarSherlock。

行 subMenu1Item.setIcon(R.drawable.ic_launcher); 用于顶部菜单按钮的 ActionBar 图标。

回应“这在设计上是不可能的”

非常感谢谷歌试图接管世界并让我们顺其自然,但是......谷歌太不一致了,不会因为不一致而脾气暴躁。如果 Google 可以为他们提供的每“一组”API 做一个例子,那就太好了。有对代码的 API 引用,但没有关于如何将它们组合在一起的示例,我只想要一个可以作为 APK 运行的完整工作示例。我可以从那里欺骗它。如果他们可以花时间编写 APK,那么在标准模板上编写一个小示例会有多困难?对于 30% 的一切,要求并不高。那天我和微软也有同样的争论,但当时也没有发生。因此,您会得到stackoverflow。:

@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);
}
于 2013-02-13T19:08:48.883 回答
2

也许你和我有同样的问题。所以对我来说,如果你使用 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的属性有所不同。

希望它可以帮助某人。

于 2015-07-24T08:21:21.727 回答
1

This is not possible by design (at least in HC - and I'm developing on API 16 and getting no icons either). Google does not want us to do that.

For a bit of discussion on the topic, see related answer here:

As one of the comments suggests, if you need the icons, consider using a dropdown menu, rather than the overflow menu.

于 2012-11-19T10:15:44.480 回答