Android 动态片段的 GridLayout 水平填充

Android GridLayout horizontal fill for dynamic fragment

我正在尝试使用 GridLayout 布局 Android 屏幕,这是一个显示我正在尝试完成的内容的模拟布局:

我将该模型转换为布局,这是模拟器中的结果 运行:

我希望中间的黑色组件尽可能多地使用水平 space,就像在模拟布局中一样。但是正如您所见,右侧的白色组件正在使用所有可用的水平 space.

我在日志中收到此错误:

01-06 08:27:38.045: D/android.widget.GridLayout(7745): horizontal constraints: x2-x0>=71, x1-x0>=64, x2-x1>=128, x3-x2>=1280, x3-x0<=1280 are inconsistent; permanently removing: x3-x0<=1280.

我使用 2 个 FrameLayout 组件作为动态加载片段的占位符。因此,例如,根据在红色面板中单击哪个按钮,不同的片段将加载到黑色面板中。我看到的另一个相关问题是黑色面板会根据加载的片段中的按钮数量改变大小。

如果可能的话,我更愿意使用 GridLayout,但也许我尝试使用 GridLayout 做的事情是不可能的?我试图让此布局与线性和相对布局一起使用,但无法正确处理。

这是我的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnCount="3">

    <FrameLayout
        android:id="@+id/category_placeholder"
        android:layout_column="0"
        android:layout_gravity="fill_vertical"
        android:background="#0f0"
        android:gravity="start"
    />

    <FrameLayout
        android:id="@+id/menu_item_placeholder"
        android:layout_column="1"
        android:layout_gravity="fill_horizontal|fill_vertical"
        android:background="#00f"
        android:gravity="start"
    />

    <fragment
        android:id="@+id/cart"
        android:layout_column="2"
        android:layout_gravity="fill_vertical"
        android:layout_rowSpan="2"
        class="com.example.splitscreen.OrderFragment"
        android:background="#4b0082"
        android:gravity="end" />

    <TextView
        android:id="@+id/xxx"
        android:layout_column="0"
        android:layout_columnSpan="2"
        android:layout_gravity="fill_horizontal"
        android:layout_row="1"
        android:background="#0f0"
        android:gravity="center"
        android:padding="25dp"
        android:text="xxx"
        android:textColor="#0f0" >
    </TextView>
</GridLayout>

我不确定这是否是 "best" 方法,但我最终通过返回使用嵌套 LinearLayout 解决了这个问题。这似乎给了我 want/need,允许我通过提供权重按比例调整组件的大小。我花了一点时间来掌握它,但我终于弄明白了。结果如下所示:

这是布局 xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    android:baselineAligned="false"
    android:orientation="vertical"
    android:weightSum="8"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="6"
        android:baselineAligned="false"
        android:orientation="horizontal"
        android:weightSum="8" >

        <FrameLayout
            android:id="@+id/category_placeholder"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="@android:color/holo_red_dark"
            android:gravity="center"
            android:textColor="#000" >
        </FrameLayout>

        <FrameLayout
            android:id="@+id/menu_item_placeholder"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="5"
            android:background="#00f"
            android:gravity="center"
            android:textColor="#fff" >
        </FrameLayout>

        <fragment
            android:id="@+id/cart"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="2"
            class="com.example.splitscreen.OrderFragment"
            android:background="#4b0082"
            android:gravity="center"
            android:textColor="#fff" >
        </fragment>
    </LinearLayout>

    <TextView
        android:id="@+id/xxx"
        android:background="#0f0"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:padding="25dp"
        android:text="xxx"
        android:textColor="#0f0" >
    </TextView>
</LinearLayout>

一个小警告似乎是我确实收到警告 "Nested weights are bad for performance",但目前这似乎是 best/only 选项,我可以按照我的方式开始工作和布局想要它们。