tablas studio linearlayout gridlayout ejemplos ejemplo diseño dinamicas android android-layout

studio - ¿Cómo especifico el ancho y alto de las celdas de Android GridLayout en medidas relativas?



tablas dinamicas en android studio (5)

GridLayout descubrir cómo funciona GridLayout , pero una cosa que no puedo deducir de la documentación es cómo o si se puede controlar el tamaño de las celdas de la grilla.

Digamos que quiero una cuadrícula de dos por dos donde cada celda ocupe exactamente el 25% de la pantalla de bienes raíces (media altura, mitad de ancho). ¿Puedo hacer esto?

Con LinearLayout lo conseguiría anidando dos LinearLayout horizontales en una vertical y luego asignando un peso de 1 a todos los elementos. GridLayout no es compatible con la propiedad de peso.


Hay dos propiedades android: layout_columnWeight y layout_rowWeight que funciona como layout_weight en LinearLayout. Esto es compatible con la API 21. Para dispositivos Android antiguos, use GridLayout de la biblioteca de soporte v7.

Esas propiedades le permitirán ajustar el ancho / alto de la base de la columna en el valor que asignó a cada columna. La fórmula es la siguiente (column_weight / sum_of_column_weight) * gridLayout_width = column_width.

Aquí hay un ejemplo que es una vista en cuadrícula con 2 filas y 2 columnas distribuidas uniformemente, cada una toma el 50% del peso y la altura de la cuadrícula.

<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>


Hay un método de ayuda dentro de 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; } }

Normalmente esto solo es una reflexión de pensamiento accesible.

Y la versión más pequeña:

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


He hecho mi propia tabla 3 * 3 para el dedo tres en tic tac usando las dimensiones siguientes. Este código es para la primera fila. Hice lo mismo para otras filas también.

<android.support.v7.widget.GridLayout android:id="@+id/gridLayout" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/board" app:columnCount="3" app:layout_constraintBottom_toBottomOf="@+id/blackboard" app:layout_constraintEnd_toEndOf="@+id/blackboard" app:layout_constraintStart_toStartOf="@+id/blackboard" app:layout_constraintTop_toTopOf="@+id/blackboard" app:rowCount="3"> <ImageView android:id="@+id/imageView" android:layout_width="80dp" android:layout_height="80dp" app:layout_column="0" app:layout_row="0" app:layout_rowWeight="1" app:layout_columnWeight="1" app:layout_gravity="center"/> <ImageView android:id="@+id/imageView2" android:layout_width="80dp" android:layout_height="80dp" app:layout_column="1" app:layout_row="0" app:layout_rowWeight="1" app:layout_columnWeight="1" app:layout_gravity="center"/> <ImageView android:id="@+id/imageView3" android:layout_width="80dp" android:layout_height="80dp" app:layout_column="2" app:layout_row="0" app:layout_rowWeight="1" app:layout_columnWeight="1" app:layout_gravity="center"/>


Sería algo como esto:

<?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>


parece que configurarlo como lo desea debería ser bastante sencillo de acuerdo con la documentación:

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

y en el conjunto de los niños

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

This referencia también menciona el estiramiento:

Para evitar que una columna se estire, asegúrese de que uno de los componentes en la columna no define la gravedad.

Lo que parecería una solución para mantener las filas y columnas en una proporción de 50:50 sin cambiar el tamaño según el contenido