Разрыв строки меню Android

1

У меня есть следующий файл 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?

Теги:
android-xml
android-menu

1 ответ

5
Лучший ответ

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

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

Изображение 174551


Я сделал больше исследований по этому поводу. Существует класс под названием 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;
        }
    }
}

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

Изображение 174551

  • 0
    Я знаю, но в этом конкретном сценарии мне нужно построить это для одной платформы (HTC Desire). Если вы посмотрите на браузер по умолчанию, он имеет макет меню 2x3. WhatsApp имеет 2-3 макета меню, поэтому можно иметь только 2 кнопки в ряду. Это потому, что у меня только одна кнопка в последней группе?
  • 0
    Я обновил свой ответ, чтобы объяснить это поведение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню