MenuItem.SHOW_AS_ACTION_IF_ROOM是如何工作的?

9

开始使用操作栏...

对于MenuItem.SHOW_AS_ACTION_IF_ROOM,文档说明如下:

如果系统认为有足够的空间,则在操作栏中显示此项作为按钮。

我的问题是,系统如何决定是否有足够的空间,我能否影响或调整这个决定?

在我的情况下,我有一些菜单项适合显示为操作按钮——如果有足够的空间。在较小的屏幕上,它们占用了足够的空间,使操作栏的标题变成省略号。在这种情况下,我更希望它们进入操作溢出菜单,而不是遮挡标题。

PS. 我正在使用ActionBarSherlock,并没有检查原生ActionBar是否完全相同。如果原生ActionBar不允许“如果有空间”的操作项缩小标题太多,那么很好,我会去寻找ActionBarSherlock中的错误。

3个回答

8
根据官方的 Android 设计指南 (http://developer.android.com/design/patterns/actionbar.html):

以下规则控制操作栏的容量:

  • 主操作栏中的操作按钮不得占用超过 50% 的宽度。底部操作栏上的操作按钮可以使用整个宽度。
  • 以密度无关像素 (dp) 为单位的屏幕宽度决定了可放置在主操作栏中的项目数:
    • 小于 360 dp = 2 个图标
    • 360-499 dp = 3 个图标
    • 500-599 dp = 4 个图标
    • 600 dp 及以上 = 5 个图标

4

好的,这并不难理解,逻辑在 ActionMenuPresenter.java 中。

看起来:

  • 动作按钮不允许占据超过一半的水平空间。
  • 显示的动作按钮数量也受限于屏幕宽度(R.integer.abs__max_action_buttons)。
  • 如果动作属于同一组,则可以突破数字限制,但不能突破宽度限制。如果组突破了宽度限制,则整个组都会溢出。

1
我是 ActionBarSherlock 的用户,我建议您浏览 Wharton 的源代码以获取答案。
据我所知,他有自己的布局和 onMeasure 方法,在其中检查标题、徽标和菜单项视图是否可以放置在操作栏中,并定义它们的摘要宽度。
如果我记得没错,您可以在 BaseMenuPresenter 类中检查他的逻辑。

逻辑似乎是ActionMenuPresenter类:操作项不能占用超过一半的水平空间,而且基于屏幕宽度,最大操作数也受到限制。然后还有特殊情况... - Pēteris Caune
是的,如果将所有菜单 showAsAction 标志都设置为 always,它们将全部出现在操作栏中。我通过智能覆盖 BaseMenuPresenter 类中的 updateMenu 方法来解决了这个问题。 - Orest
检查一下ActionBarSherlock 4.0 beta版本,我想它会解决你的问题。 - Orest
@Orest 但是如果你有太多的,一些应该放到溢出菜单中怎么办? - android developer

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