如何在相关度量中指定Android GridLayout单元格的宽度和高度?

我试图弄清楚GridLayout是如何工作的,但是我从文档中找不到的一件事就是如何控制网格单元的大小。

假设我想要一个两乘两格的格子,每个格子占据屏幕空间的25%(半高,半宽) – 我能做到吗?

使用LinearLayout,我可以通过在一个垂直中嵌套两个水平的LinearLayout来实现这一点,然后为所有元素赋予一个权重 1。 GridLayout虽然不支持weight属性。

Solutions Collecting From Web of "如何在相关度量中指定Android GridLayout单元格的宽度和高度?"

有两个属性android:layout_columnWeight和layout_rowWeight在LinearLayout中像layout_weight一样工作。 这在API 21中受支持。对于较旧的Android设备,请使用v7支持库中的GridLayout。

这些属性将允许您根据分配给每列的值来调整列基的宽度/高度。 公式如下所示(column_weight / sum_of_column_weight)* gridLayout_width = column_width。

这里有一个例子,它是一个2行2列均匀分布的gridview,每个占50%的网格重量和高度。

<GridLayout android:layout_width="match_parent" android:layout_height="match_parent" android:columnCount="2" > <TextView android:text="SEARCH FEE" android:layout_columnWeight="1" android:layout_rowWeight="1" /> <TextView android:layout_columnWeight="1" android:text="SEARCH FEE" android:layout_rowWeight="1" /> <TextView android:text="SEARCH FEE" android:layout_columnWeight="1" android:layout_rowWeight="1" /> <TextView android:layout_columnWeight="1" android:text="SEARCH FEE" android:layout_rowWeight="1" /> </GridLayout> 

它看起来像设置它,因为你希望应该是相当简单的根据文件:

 android:rowCount='2' android:columnCount='2' 

并在儿童套装

 android:layout_columnSpan="1" android:layout_rowSpan="1" 

这个参考文献还提到了拉伸:

要防止色谱柱拉伸,请确保色谱柱中的其中一个组分未定义重力。

这似乎是一个解决scheme,以50:50的比例保持行和列不根据内容的大小

这将是这样的:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="2" app:rowCount="2"> <TextView android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" android:text="1" app:layout_columnWeight="1" app:layout_rowWeight="1" /> <TextView android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" android:text="2" app:layout_columnWeight="1" app:layout_rowWeight="1" /> <TextView android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" android:text="3" app:layout_columnWeight="1" app:layout_rowWeight="1" /> <TextView android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" android:text="4" app:layout_columnWeight="1" app:layout_rowWeight="1" /> </android.support.v7.widget.GridLayout> 

GridLayout中有一个辅助方法:

 GridLayout.LayoutParams params = new GridLayout.LayoutParams(); params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, getAlignment(Gravity.NO_GRAVITY, true), 1); item.setLayoutParams(params); private GridLayout.Alignment getAlignment(int gravity, boolean horizontal) { int mask = horizontal ? HORIZONTAL_GRAVITY_MASK : VERTICAL_GRAVITY_MASK; int shift = horizontal ? AXIS_X_SHIFT : AXIS_Y_SHIFT; int flags = (gravity & mask) >> shift; switch (flags) { case (AXIS_SPECIFIED | AXIS_PULL_BEFORE): return horizontal ? LEFT : TOP; case (AXIS_SPECIFIED | AXIS_PULL_AFTER): return horizontal ? RIGHT : BOTTOM; case (AXIS_SPECIFIED | AXIS_PULL_BEFORE | AXIS_PULL_AFTER): return FILL; case AXIS_SPECIFIED: return CENTER; case (AXIS_SPECIFIED | AXIS_PULL_BEFORE | GravityCompat.RELATIVE_LAYOUT_DIRECTION): return START; case (AXIS_SPECIFIED | AXIS_PULL_AFTER | GravityCompat.RELATIVE_LAYOUT_DIRECTION): return END; default: return GridLayout.FILL; } } 

通常情况下,这只是思考的反思。

而较小的版本:

 params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, GridLayout.FILL, 1);