Android 菜单换行 [英] Android menu line break

查看:24
本文介绍了Android 菜单换行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下 Android 菜单 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.

例如,假设您有横向的平板电脑(例如 Galaxy Tab).它有相当多的水平空间和相对较小的高度.因此,如果在这种情况下强制换行,那将是浪费空间.

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

<小时>

因此,例如,如果您增加第一项的宽度,则菜单中将出现两行.但这可能是不可取的,因为您无法预测将在不同设备上使用的文本样式、大小和字体.


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.

这篇关于Android 菜单换行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆