No estoy seguro de que esto sea posible con los widgets actuales. Su mejor opción podría ser poner su vista personalizada en un "SquareView" personalizado. Esta vista solo podría contener 1 vista secundaria y forzar la altura para que sea igual al ancho cuando se llama a su método onLayout.
Nunca intenté hacer algo así, pero creo que no debería ser demasiado difícil. Una solución alternativa (y tal vez un poco más fácil) podría ser subclasificar el diseño raíz de su vista personalizada (por ejemplo, si es un LinearLayout, haga un SquareLinearLayout) y usarlo como un contenedor en su lugar.
editar: Aquí hay una implementación básica que parece funcionar para mí:
package com.mantano.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
public class SquareView extends ViewGroup {
public SquareView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onLayout(boolean changed, int l, int u, int r, int d) {
getChildAt(0).layout(0, 0, r-l, d-u);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
View child = getChildAt(0);
child.measure(widthMeasureSpec, widthMeasureSpec);
int width = resolveSize(child.getMeasuredWidth(), widthMeasureSpec);
child.measure(width, width);
setMeasuredDimension(width, width);
}
}
Está diseñado para tener un hijo único, pero ignoré todas las comprobaciones por simplicidad. La idea básica es medir al niño con los parámetros de ancho / alto establecidos por GridView (en mi caso, usa numColumns = 4 para calcular el ancho), y luego hacer una segunda pasada con las dimensiones finales, con alto = ancho. .. El diseño es simplemente un diseño simple, que coloca al niño único en (0, 0) con las dimensiones deseadas (derecha-izquierda, abajo-arriba).
Y aquí está el XML utilizado para los elementos de GridView:
<?xml version="1.0" encoding="utf-8"?>
<com.mantano.widget.SquareView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:id="@+id/item" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="horizontal"
android:gravity="center">
<TextView android:id="@+id/text" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Hello world" />
</LinearLayout>
</com.mantano.widget.SquareView>
Usé un LinearLayout dentro de SquareView para que administre todas las posibilidades de gravedad, márgenes, etc.
No estoy seguro de qué tan bien (o mal) reaccionaría este widget a los cambios de orientación y dimensión, pero parece funcionar correctamente.