ActionBarSherlock - 如何将溢出的操作项显示为图标和文本

24

上下文

我正在使用ActionbarSherlock创建一个带有一些操作项的动作栏。其中一些项目已经溢出,因此它们显示在溢出子菜单中。

我的问题

这些溢出的项目只以纯文本的形式显示在子菜单中。

我尝试了MenuItem.SHOW_AS_ACTION_IF_ROOMMenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT用于setShowAsAction(),但两者的行为相同:

Overflowed items without icon

我想要的

是否可以将这些项目以 <their_icon> + <their_text>的方式显示在溢出子菜单中?类似于这样:

Overflowed items with icon


你有过这方面的成功经历吗? - Quentamia
还没有...不过,看起来原生的ActionBar(API级别11+)可以做到这一点(请参见:http://developer.android.com/design/patterns/actionbar.html,特别是Android 4.0中的图库应用程序图像),或者这是一个特殊的“手工”实现? - Christian García
@Cristian,提到的链接中没有这样的示例图像。该页面上唯一具有图标的“下拉”菜单是“共享”菜单,但那不是“操作溢出”。 - Gavriel
@Gavriel,你说得对,我现在意识到了。我猜那个“下拉菜单”是使用Arise发布的自定义“菜单-子菜单”模式,对吧? - Christian García
4个回答

15

我不太明白为什么子菜单可以有图标而菜单只能有文本。或许将菜单项作为子菜单添加到菜单中会有所帮助。 :)

另外提一下,像这样添加图标将会强制你使用ActionBar(Sherlock),而不是在旧版Android中按下菜单键时在底部显示菜单的标准方式。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/root_menu"
    android:icon="@drawable/ic_menu_moreoverflow_normal_holo_light"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/menu_settings"
            android:icon="@drawable/ic_menu_settings_holo_light"
            android:showAsAction="never"
            android:title="Settings" />
        <item
            android:id="@+id/menu_about"
            android:icon="@drawable/ic_menu_info_details"
            android:showAsAction="never"
            android:title="About"/>
   </menu>
</item>
</menu>

谢谢,@Arise。这就是我为了实现这个外观所做的事情。然而,我没有将其发布为解决方案,因为我认为它只是我的特定情况下的一种解决方法,因为它意味着强制在操作栏中分配操作项(即强制它们为1、2或3),而不是让系统决定要显示多少个操作项。无论如何,如果您想在操作栏菜单中定义特定的_tree_,您的答案是有帮助的。 - Christian García
如果您知道下拉列表包含什么内容,那么这是一个很好的答案,基本上当它不需要是动态的时候。谢谢! - shecodesthings
我最终将其标记为解决方案,因为除了创建子菜单之外,目前没有其他添加图标的方法。 - Christian García
有很多其他的方法可以做到这一点,但你选择了更简单的方式。+1 - Robi Kumar Tomar

6

1. 在com.actionbarsherlock.internal.view.menu.MenuBuilder.java中将“mOptionalIconsVisible”值更改为true。然后您将始终看到图标,仅适用于ActionBarSherlockCompact.java。

2. 更改源代码以添加一个API,用于设置MenuBuilder.java和MenuWrapper.java的图标。


感谢您的回答,rohn.chan。然而,我想应用一种不需要修改ActionBarSherlock源代码的解决方案,因为我必须在每次更新此库时应用它。 - Christian García
有点晚了,但你不必每次都应用修改。只需获取Actionbar Sherlock存储库的副本,进行修改并拉取更新即可。新的变更集在拉取时被应用,但您的更改不会在此过程中被擦除。 - Teovald

5

我有一个解决方案适用于这种情况。如果你确定想要放置在溢出菜单中的内容,那么你可以将它们放在子菜单中,并通过重写onCreateOptionsMenu方法来添加子菜单项的图标和标题。

以下是我实现此功能所做的事情:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    menu.add(0, 1, 1, "MENU ONE TITLE")
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

    SubMenu subMenu = menu.addSubMenu(0, 0, 2, "MENU TWO TITLE");

    subMenu.add(0, 2, 2, "SUB MENU ONE TITLE")
    .setIcon(R.drawable.sub_menu_one_icon);

    subMenu.add(0, 3, 3, "SUB MENU TWO TITLE")
    .setIcon(R.drawable.sub_menu_two_icon);

    MenuItem subMenuItem = subMenu.getItem();
    subMenuItem.setIcon(R.drawable.menu_two_icon);
    subMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

    return super.onCreateOptionsMenu(menu);
}

这是与@Arise答案程序上等价的解决方案。问题在于我并不知道溢出菜单中确切需要包含什么,它应该是自动的(即由系统决定)。例如,在有足够空间的设备上,我发布的示例中的溢出菜单不应该显示,因为有足够的空间来显示所有项目。 - Christian García

0

实际上,即使是为溢出菜单创建的弹出菜单,也有一种方法可以将图标添加到文本中。例如:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接