如何在ActionBar溢出菜单中显示图标?

时间:2012-08-16 07:51:54

标签: android android-layout actionbarsherlock android-ui

我想在溢出下拉菜单中显示菜单项标题以外的图标。

有可能吗?

6 个答案:

答案 0 :(得分: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>

这将显示菜单中的图标

答案 1 :(得分:4)

实际上有一种简单的方法可以实现它,因为你看到的实际上是一个TextView,所以你设置了一个跨度,例如:

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);

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

答案 2 :(得分:3)

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

adgyal xmlns:app showAsAction app 的属性。

希望它有所帮助。

答案 3 :(得分:2)

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

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

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

回应“这不可能通过设计”

非常感谢谷歌试图接管世界并让我们骑着它的外套尾巴,但是...谷歌太不稳定而不是因为不一致而变得脾气暴躁。 如果谷歌可以为他们提供的每一套“API”做一个例子,那就太好了。有代码的API引用,但没有关于如何将它们放在一起的示例,可以作为APK运行的完整工作示例是我想要的。我可以从那里骗过它。如果他们可以花时间编写APK,那么在标准模板上编写一个小例子会有多难?对于30%的一切,要求的并不多。 我当天和微软有过同样的争论,但当时也没有。因此,你得到stackoverflow。 :)令人遗憾的是,需要一些人(杰克沃顿的摇滚乐队)独立工作,用一个向后兼容的动作栏做得更好,而谷歌可以拿出它荒谬的Action Bar Patch thingy。

@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);
}

答案 4 :(得分: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);
}

参考:How To show icons in Overflow menu in ActionBar

答案 5 :(得分:1)

这在设计上是不可能的(至少在HC中 - 我在API 16上开发并且也没有获得图标)。谷歌不希望我们这样做。

有关该主题的一些讨论,请参阅此处的相关答案:

正如其中一条评论所暗示的,如果您需要图标,请考虑使用下拉菜单,而不是溢出菜单。