【问题标题】:ActionBarSherlock - Show overflowed action items as icon + textActionBarSherlock - 将溢出的操作项显示为图标 + 文本
【发布时间】:2012-05-16 09:18:53
【问题描述】:

上下文

我正在使用 ActionbarSherlock 创建一个带有一些操作项的操作栏。有的溢出了,所以显示在溢出子菜单中。

我的问题

那些溢出的项目在子菜单中显示为纯文本。

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

我想要什么

是否可以在溢出子菜单中将这些项目显示为<their_icon> + <their_text>?像这样的:

【问题讨论】:

  • 你在这方面有过成功吗?
  • 还没有...但是,看起来本机 ActionBar(API 级别 11+)能够做到这一点(参见:developer.android.com/design/patterns/actionbar.html,特别是 Android 4.0 中画廊应用程序的图像),还是一种特殊的“手工”实现?
  • @Cristian,在提到的链接中没有这样的示例图像。该页面中唯一具有图标的“下拉”菜单是“共享”菜单,但不是“操作溢出”
  • @Gavriel,你是对的,我现在意识到了。我猜。那么,对于那个“下拉”,使用了 Arise 发布的自定义“菜单-子菜单”模式,不是吗?

标签: android actionbarsherlock


【解决方案1】:

我也不明白为什么子菜单可以有图标和菜单只有文本。 也许将菜单项作为子菜单添加到 root 菜单可以帮助您。 :)

请注意,添加这样的图标将迫使您使用 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),而不是让系统决定显示多少。无论如何,如果您想在操作栏菜单中定义特定的,您的回答会很有帮助
  • 如果你知道你的下拉列表包含什么,基本上是当它不需要是动态的时候。谢谢!
  • 我最终会将此标记为解决方案,因为除了创建子菜单之外,目前没有添加图标的方法
  • 还有很多其他的方法可以做到这一点,但你以更简单的方式完成了。 +1
【解决方案2】:

1、将com.actionbarsherlock.internal.view.menu.MenuBuilder.java中“mOptionalIconsVisible”的值改为true。然后你会一直看到这些图标。 仅适用于 ActionBarSherlockCompact.java。

2、修改源码,为MenuBuilder.java和MenuWrapper.java添加一个api来设置图标。

【讨论】:

  • 感谢您的回答 rohn.chan。但是,我想应用一个不意味着修改 ActionBarSherlock 源代码的解决方案,因为我应该在这个库的每次更新中应用它。
  • 有点晚了,但您不必每次都应用修改。只需获取 Actionbar sherlock 存储库的副本,进行修改并拉取更新。拉取时会应用新的变更集,但不会在此过程中删除您的更改。
【解决方案3】:

我有一个解决这种情况的方法。如果您确定要放入溢出菜单中的内容,则可以将它们放入子菜单中,并且可以通过覆盖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 的答案等效的程序化程序。问题是我不知道溢出菜单中有什么,它应该是自动的(即由系统决定)。例如,在有足够空间的设备中,不应该显示我发布的示例中的溢出菜单,因为有足够的空间来显示所有项目。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2019-12-06
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多