2

次の Android メニュー XML ファイルがあります。

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

これにより、1 行に 3 つのメニュー ボタンが表示されます。ただし、最初の行に2つのボタン、下の行全体にヘルプボタンを配置して、それらを2行に分割したいと考えています。最初の 2 つをグループ化しようとしましたが、うまくいきませんでした。XML で強制的に改行するにはどうすればよいですか?

4

1 に答える 1

5

私の知る限り、メニューで改行を強制する方法はありません。いくつかのシナリオを考えると、これは実際に理にかなっています。

たとえば、横向きのタブレット (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れる興味深い関数が 1 つ見つかります。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;
        }
    }
}

たとえば、最初の項目の幅を広げると、メニューに 2 行が表示されます。しかし、さまざまなデバイスで使用されるテキスト スタイル、サイズ、およびフォントを予測できないため、これはおそらく望ましくありません。

ここに画像の説明を入力

于 2011-05-21T19:10:17.273 に答える