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