上下文操作栏强制溢出

4

由于 Android 中存在两个拥有自己菜单的 Fragmentsbug,我正在以编程方式构建我的 Actionbar 菜单项。

我在 MultiChoiceModeListeneronCreateActionMode 中构建菜单。如果菜单项超过 4 个,则所有菜单项都被强制放入上下文操作栏的溢出菜单中。

这种情况发生在纵向和横向模式下,但仅当布局处于非平板视图时(例如,两个片段都未显示)。我正在 Galaxy Nexus 上测试 Android 4.2。

    mListView = getListView();
    mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    mListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
        @Override
        public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) {
            // Inflate the menu for the CAB
            menu.add(1, 0, 0, "Menu Item 1");
            menu.add(1, 1, 1, "Menu Item 2");
            menu.add(1, 2, 2, "Menu Item 3");
            menu.add(1, 3, 3, "Menu Item 4");
            menu.add(1, 4, 4, "Menu Item 5");
            return true;
        }
    }

更新

我已经缩小了问题范围,如果有超过4个菜单项,则所有项目都会被强制放入溢出区。文本标签的长度无关紧要。即使将所有文本设置为空字符串,它们仍然会被强制放入溢出区。设置 IF_ROOMALWAYS 似乎没有影响。

更新2

我有另一个使用 OnItemLongClickListener 而不是 MultiChoiceModeListenerFragment,并且我没有遇到相同的问题。我可以放置10个菜单项,并且它会在 Actionbar 中显示前几个,并将其余的放入溢出区,如预期。

更新3

在这个问题上,使用 Nexus 7 竖屏模式仍然存在问题。但是,在非平板电脑视图中(两个片段都未显示),在 Nexus 7 横屏模式下,菜单项会显示。我唯一能想到的是,在使用 MultiChoiceModeListener 时,可能存在某些间距计算,认为上下文操作栏没有足够的空间。

你的溢出功能能正常工作吗?上次我尝试在操作模式中使用溢出功能时,溢出菜单无法正常工作。 - CommonsWare
是的,它可以正常工作,至少在Android 4.2上。但我还没有在之前的版本上测试过。 - Kris B
嗯...我得再试一次。谢谢! - CommonsWare
1个回答

1

Menu.add() 方法都会返回 MenuItem。对于每个添加的 MenuItem,只需像这样调用 MenuItem.setShowAsAction(int)

MenuItem menuItem = menu.add(1, 0, 0, "Menu Item 1");
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

我将其简化为:menu.add(1, 0, 0, "菜单项1").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);,但仍未解决溢出问题,尽管现在我可以使用setIcon为我的菜单项添加图标,这是我之前不知道的。 - Kris B
2
在几乎所有情况下,您应该使用IF_ROOM而不是ALWAYS,以确保不会强制将太多项目显示在屏幕上。 - Jake Wharton
我将它们全部更新为 IF_ROOM。我已经缩小了问题的范围,这个问题是因为在纵向模式下,如果有超过4个菜单项,则所有项目都会被强制溢出。设置 IF_ROOMALWAYS 似乎没有效果。我甚至将所有文本标签设置为空字符串,它们仍然被强制溢出。非常奇怪。 - Kris B
@JakeWharton 我已经更新了我的原始帖子并提供了更多细节。我几乎束手无策,只是考虑不再花时间调试它。这不是一个致命问题,因为菜单项可以正常工作,只是被强制放入溢出中。总之,这只是一个奇怪的问题。 - Kris B

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