Android的菜单换行符菜单、换行符、Android

2023-09-05 00:53:49 作者:我和我的小伙伴

我有以下的Andr​​oid菜单的XML文件:

I have the following Android menu XML file:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/programma"
          android:icon="@android:drawable/ic_menu_agenda"
          android:title="@string/programma" />
    <item android:id="@+id/settings"
          android:icon="@android:drawable/ic_menu_preferences"
          android:title="@string/settings" />
    <item android:id="@+id/help"
          android:icon="@android:drawable/ic_menu_help"
          android:title="@string/help" />
</menu>

这给了我在一行三个菜单按钮。不过,我要划分为两线,2个按钮的第一行,并在整个底部行的帮助按钮。我已经尝试过分组的前两个,但是这并没有这样的伎俩。 我怎么能强制换行的XML?

That gives me three menu buttons on one line. However, I want to divide them in two lines, with 2 buttons on the first row, and the help button on the entire bottom row. I already tried grouping the first two, but that didn't do the trick. How can I force a line break in the XML?

推荐答案

据我所知是没有办法来强制换行的菜单。这实际上是有道理的,如果你考虑一些方案。

As far as I know there is no way to force line break in menu. This actually makes sense if you consider some scenarios.

例如,假设你有平板电脑(例如银河标签)的横向方向。它有相当多的水平空间和相对较小的高度。因此,这将是一个浪费的空间,如果你强迫在这种情况下换行符。

For example, imagine you have tablet (for example, Galaxy Tab) in landscape orientation. It has quite a lot of horizontal space and relatively small height. So, it would be a waste of space if you force line break in such case.

我已经做了这方面的详细调查。有一类名为 使用MenuBuilder 它是用来管理选项菜单。它使用 icon_menu_layout 布局资源来绘制菜单。 这里是此资源:

I've done more investigation on this. There is a class called MenuBuilder which is used to manage options menu. It uses icon_menu_layout layout resource to draw menus. Here is this resource:

<com.android.internal.view.menu.IconMenuView
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+android:id/icon_menu"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:rowHeight="66dip"
   android:maxItems="6"
   android:maxRows="2"
   android:maxItemsPerRow="6" />

如果你遵循的 IconMenuView 实现,你会发现一个有趣的功能叫做 layoutItems 这是用来计算布局菜单项。您只能通过人为地增加宽度的菜单项会影响此功能的逻辑。不换行是可用的。

And if you follow to IconMenuView implementation, you'll find one interesting function called layoutItems which is used to calculate layout for menu items. You can only influence this function's logic by artificially increasing width of menu items. No line breaks are available.

private void layoutItems(int width) {
    int numItems = getChildCount();
    if (numItems == 0) {
        mLayoutNumRows = 0;
        return;
    }

    // Start with the least possible number of rows
    int curNumRows =
            Math.min((int) Math.ceil(numItems / (float) mMaxItemsPerRow), mMaxRows);

    /*
     * Increase the number of rows until we find a configuration that fits
     * all of the items' titles. Worst case, we use mMaxRows.
     */
    for (; curNumRows <= mMaxRows; curNumRows++) {
        layoutItemsUsingGravity(curNumRows, numItems);

        if (curNumRows >= numItems) {
            // Can't have more rows than items
            break;
        }

        if (doItemsFit()) {
            // All the items fit, so this is a good configuration
            break;
        }
    }
}

因此​​,举例来说,如果增加宽度第一个项目,你会得到菜单中的两行。但是,这可能是不可取的,因为你不能predict文字样式,大小和字体,将在不同的设备上使用。

So, for example, if you increase width of first item, you'll get two lines in menu. But this is probably undesirable, because you can't predict text style, size and font that will be used on different devices.