¿Cómo especifico el ancho y la altura de las celdas de Android GridLayout en medidas relativas?

Estoy tratando de averiguar cómo funciona GridLayout , pero una cosa que no puedo averiguar de la documentación es cómo o si se puede controlar el tamaño de las celdas de la cuadrícula.

Digamos que quiero una cuadrícula de dos por dos donde cada celda ocupan exactamente el 25% de la pantalla de bienes raíces (media altura, media anchura) – ¿puedo hacer esto?

Con LinearLayout lo lograría anidando dos LinearLayout horizontal en una vertical y asignando un peso de 1 a todos los elementos. GridLayout no admite la propiedad de peso sin embargo.

Hay dos propiedades android: layout_columnWeight y layout_rowWeight que funciona como layout_weight en LinearLayout. Esto se admite en la API 21. Para los dispositivos android más antiguos, utilice GridLayout de la biblioteca de soporte v7.

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

He aquí un ejemplo que es un gridview con 2 filas y 2 columnas uniformemente distribuidas, 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> 

Parece que configurarlo como desee debería ser bastante sencillo de acuerdo con la documentación:

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

Y en los niños

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

Esta referencia también menciona el estiramiento:

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

Lo que parece una solución para mantener las filas y columnas en una proporción de 50:50 sin redimensionar de acuerdo al contenido

Sería algo así:

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

Hay un método auxiliar dentro del 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 es sólo una reflexión de pensamiento accesible.

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

 params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, GridLayout.FILL, 1); 
  • MPAndroidChart PieChart no se muestra cuando se utiliza en ScrollView
  • ¿Cuál es la diferencia entre match_parent y fill_parent?
  • FrameLayout a RelativeLayout ClassCastException incluso si no hay FrameLayout usado
  • Propio Layout, método onDraw () no se llama
  • Resolución de imagen para mdpi, hdpi, xhdpi y xxhdpi
  • Vista de navegación de Android: Desplácese por los elementos del menú sólo para emitir
  • ¿La publicación de Runnable a un hilo de interfaz de usuario garantiza que el diseño esté terminado cuando se ejecuta?
  • Tema personalizado de Android: tema diferente para el modo horizontal y vertical
  • Android no está recolectando el archivo derecha dimens.xml de la carpeta de valores
  • ¿Qué método de actividad se llama después de todos los métodos de disposición?
  • SetMargin Programmatically no funciona correctamente para RelativeLayoutParams
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.