GridLayout将列中的子项对齐

时间:2014-08-20 02:18:49

标签: android android-gridlayout

我有一个GridLayout,由6个孩子组成。它的列数为2.左列的子项的layout_gravitystart|end|fill_horizontallayout_width为0dp,这会导致它们填充所有可用空间。

这很棒,并给出了如下所示的输出。 enter image description here

视图4,5和6只有它们需要的大小。很酷。我现在想将视图4,5和6与容器的右侧对齐,但事实证明这很有挑战性。由于GridLayout确定列灵活性的方式,给出正确列的视图layout_gravity right会破坏布局。第一列中的视图不再填充布局中的剩余宽度。 (根据我的理解,这是因为现在两列都有子项定义水平引力,因此GridLayout不能再将一列标记为灵活的。)

有没有办法实现这个目标?我真的不喜欢嵌套LinearLayout。以下是我想要的结果。

enter image description here

作为参考,当前的视图层次结构XML看起来像......

<GridLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:columnCount="2">

    <View
        android:id="@+id/view1"
        android:layout_gravity="start|end|fill_horizontal" />

    <View
        android:id="@+id/view4" />

    <View
        android:id="@+id/view2"
        android:layout_gravity="start|end|fill_horizontal" />

    <View
        android:id="@+id/view5" />

    <View
        android:id="@+id/view3"
        android:layout_gravity="start|end|fill_horizontal" />

    <View
        android:id="@+id/view6" />

</GridLayout>

2 个答案:

答案 0 :(得分:16)

来自GridLayout的文档:

  

超额空间分布

     

同一行或列组中的多个组件被视为并行操作。只有当其中的所有组件都是灵活的时,这样的组才是灵活的。位于公共边界两侧的行和列组被认为是串行操作。 如果其中一个元素是灵活的,则由这两个元素组成的复合组是灵活的。

     

要使柱伸展,请确保其中的所有组件都定义了重力。要防止色谱柱拉伸,请确保色谱柱中的某个组分未定义重力。

     

当灵活性原则不能完全消除歧义时, GridLayout的算法更倾向于靠近其右边和底边的行和列。

(强调我的)

所以,设计以下输出: enter image description here

说明:

enter image description here

注意:

  • 不要将右列最大宽度组件的重力与任何轴(例如顶部,底部,左侧,右侧)对齐。当视图与轴对齐时,它将不会拉伸,因为复合组将变得不灵活。这将使复合组中的其他元素收缩(即使指定了fill_horizo​​ntal,它也将在非灵活复合组中无效)。最宽组件的宽度将是网格中右侧列的宽度。

  • 如果希望文本在内容长度增加时换行,请将视图宽度指定为0dp(android:layout_width="0dp"),以便网格布局将动态计算宽度:

enter image description here

网格布局的XML:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:alignmentMode="alignBounds"
    android:background="#ffffffff"
    android:columnCount="6"
    android:columnOrderPreserved="false"
    android:orientation="horizontal"
    android:padding="5dp"
    android:useDefaultMargins="true" >

    <Button
        android:id="@+id/view1"
        android:layout_width="0dp"
        android:layout_columnSpan="4"
        android:layout_gravity="left|fill"
        android:background="#ff00BFFF"
        android:text="View 1" />

    <Button
        android:id="@+id/view4"
        android:layout_columnSpan="2"
        android:layout_gravity="right|clip_horizontal"
        android:background="#ffff0000"
        android:padding="5dp"
        android:text="hi"
        android:textColor="#ffffffff" />

    <Button
        android:id="@+id/view2"
        android:layout_width="0dp"
        android:layout_columnSpan="4"
        android:layout_gravity="left|fill"
        android:background="#ff00ff00"
        android:text="View 2 has a very very very long text" />

    <Button
        android:id="@+id/view5"
        android:layout_columnSpan="2"
        android:layout_gravity="clip_horizontal"
        android:background="#ffDDA0DD"
        android:padding="5dp"
        android:text="hello something"
        android:textColor="#ffffffff" />

    <Button
        android:id="@+id/view3"
        android:layout_width="0dp"
        android:layout_columnSpan="4"
        android:layout_gravity="left|fill"
        android:background="#ffffD700"
        android:text="View 3 has a very very very long text" />

    <Button
        android:id="@+id/view6"
        android:layout_columnSpan="2"
        android:layout_gravity="clip_horizontal|right"
        android:background="#ff4169E1"
        android:padding="5dp"
        android:text="hello world"
        android:textColor="#ffffffff" />

</GridLayout>

答案 1 :(得分:1)

让我修改我的答案并使用不同的方法。这是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="2" >


<TextView
    android:id="@+id/TextView1"
    android:layout_column="0"
    android:layout_columnSpan="1"
    android:layout_row="0"
    android:background="#87CEFA"
    android:text="@string/view1" />

<TextView
    android:id="@+id/TextView4"
    android:gravity="right"
    android:layout_column="1"
    android:layout_columnSpan="1"
    android:layout_row="0"
    android:layout_gravity="right"
    android:background="#FF3030"
    android:text="@string/view4" />

<TextView
    android:id="@+id/TextView2"
    android:layout_column="0"
    android:layout_columnSpan="1"
    android:layout_row="1"
    android:width="0dp"
    android:layout_gravity="fill_horizontal"
    android:background="#90EE90"
    android:text="@string/view2" />

<TextView
    android:id="@+id/TextView5"
    android:gravity="right"
    android:layout_column="1"
    android:layout_columnSpan="1"
    android:layout_row="1"
    android:background="#EE82EE"
    android:paddingLeft="36dp"
    android:layout_gravity="right"
    android:text="@string/view5" />

<TextView
    android:id="@+id/TextView3"
    android:layout_column="0"
    android:layout_columnSpan="1"
    android:layout_row="2"
    android:width="0dp"
    android:layout_gravity="fill_horizontal"
    android:background="#EEEE00"
    android:text="@string/view3" />

<TextView
    android:id="@+id/TextView6"
    android:gravity="right"
    android:layout_column="1"
    android:layout_columnSpan="1"
    android:layout_row="2"
    android:background="#EE7621"
    android:layout_gravity="right"
    android:text="@string/view6" />

</GridLayout>

结果如下:

enter image description here

两列的宽度由内容驱动。对于View 5,我在左侧添加了填充,即填充可用于扩展单元格的宽度(和高度)。这会有用吗?