Разрыв строки меню Android - PullRequest
2 голосов
/ 21 мая 2011

У меня есть следующий XML-файл меню Android:

<?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>

Это дает мне три кнопки меню в одной строке.Однако я хочу разделить их на две строки, с двумя кнопками в первом ряду и кнопкой справки во всем нижнем ряду.Я уже пытался сгруппировать первые два, но это не помогло.Как я могу заставить разрыв строки в XML?

1 Ответ

5 голосов
/ 21 мая 2011

Насколько я знаю, в меню нет возможности принудительно разорвать строку.Это на самом деле имеет смысл, если вы рассматриваете некоторые сценарии.

Например, представьте, что у вас есть планшет (например, Galaxy Tab) в альбомной ориентации.Он имеет достаточно много горизонтального пространства и сравнительно небольшую высоту.Так что в таком случае было бы пустой тратой места.

enter image description here


Я провел дополнительное расследование по этому вопросу.Существует класс с именем MenuBuilder, который используется для управления меню параметров.Он использует icon_menu_layout ресурс макета для рисования меню. Здесь - это ресурс:

<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, который используется для расчета макета для пунктов меню.Вы можете влиять только на логику этой функции, искусственно увеличивая ширину пунктов меню.Нет разрывов строк.

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

Так, например, если вы увеличите ширину первого элемента, вы получите две строки в меню.Но это, вероятно, нежелательно, поскольку вы не можете предсказать стиль, размер и шрифт текста, который будет использоваться на разных устройствах.

enter image description here

...