Как указать ширину и высоту ячеек Android GridLayout в относительных показателях?

Я пытаюсь понять, как работает GridLayout , но я не могу понять из документации, как можно управлять размером ячеек сетки.

Скажем, я хочу две-две сетки, где каждая ячейка занимает ровно 25% экранной недвижимости (половина высоты, половина ширины). Могу ли я это сделать?

С LinearLayout я выполнил бы это, вложив два горизонтальных LinearLayout в одну вертикаль, а затем присвоив весу 1 всем элементам. Однако GridLayout не поддерживает весовое свойство.

Solutions Collecting From Web of "Как указать ширину и высоту ячеек Android GridLayout в относительных показателях?"

Есть два свойства android: layout_columnWeight и layout_rowWeight, который работает как layout_weight в LinearLayout. Это поддерживается в API 21. Для более старых устройств Android используйте GridLayout из библиотеки поддержки v7.

Эти свойства позволят вам настроить ширину / высоту базы столбцов на значение, присвоенное каждому столбцу. Формула выглядит следующим образом (column_weight / sum_of_column_weight) * gridLayout_width = column_width.

Вот пример, который представляет собой сетку с двумя строками и двумя столбцами, равномерно распределенными, каждый занимает 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" 

В этой ссылке также упоминается растяжка:

Чтобы предотвратить растяжение столбца, убедитесь, что один из компонентов в столбце не определяет гравитацию.

Который бы выглядел как решение сохранить строки и столбцы в соотношении 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);