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

#java #android #xml #android-xml #android-menu

#java #Android #xml #android-xml #android-menu

Вопрос:

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

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

Ответ №1:

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

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

введите описание изображения здесь


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

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

введите описание изображения здесь

Комментарии:

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