我有一个GridLayout
,由6个孩子组成。它的列数为2.左列的子项的layout_gravity
为start|end|fill_horizontal
且layout_width
为0dp,这会导致它们填充所有可用空间。
这很棒,并给出了如下所示的输出。
视图4,5和6只有它们需要的大小。很酷。我现在想将视图4,5和6与容器的右侧对齐,但事实证明这很有挑战性。由于GridLayout
确定列灵活性的方式,给出正确列的视图layout_gravity
right
会破坏布局。第一列中的视图不再填充布局中的剩余宽度。 (根据我的理解,这是因为现在两列都有子项定义水平引力,因此GridLayout
不能再将一列标记为灵活的。)
有没有办法实现这个目标?我真的不喜欢嵌套LinearLayout
。以下是我想要的结果。
作为参考,当前的视图层次结构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>
答案 0 :(得分:16)
来自GridLayout的文档:
超额空间分布
同一行或列组中的多个组件被视为并行操作。只有当其中的所有组件都是灵活的时,这样的组才是灵活的。位于公共边界两侧的行和列组被认为是串行操作。 如果其中一个元素是灵活的,则由这两个元素组成的复合组是灵活的。
要使柱伸展,请确保其中的所有组件都定义了重力。要防止色谱柱拉伸,请确保色谱柱中的某个组分未定义重力。
当灵活性原则不能完全消除歧义时, GridLayout的算法更倾向于靠近其右边和底边的行和列。
(强调我的)
所以,设计以下输出:
不要将右列最大宽度组件的重力与任何轴(例如顶部,底部,左侧,右侧)对齐。当视图与轴对齐时,它将不会拉伸,因为复合组将变得不灵活。这将使复合组中的其他元素收缩(即使指定了fill_horizontal,它也将在非灵活复合组中无效)。最宽组件的宽度将是网格中右侧列的宽度。
如果希望文本在内容长度增加时换行,请将视图宽度指定为0dp(android:layout_width="0dp"
),以便网格布局将动态计算宽度:
<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>
结果如下:
两列的宽度由内容驱动。对于View 5,我在左侧添加了填充,即填充可用于扩展单元格的宽度(和高度)。这会有用吗?