Je ne suis pas sûr que c'est possible avec le widgets. Votre meilleur pari pourrait être de mettre votre affichage personnalisé personnalisé dans un "SquareView". Ce point de vue pourrait ne contiennent que 1 vue d'enfant, et de la force de la hauteur égale à la largeur de ses onLayout méthode est appelée.
Je n'ai jamais essayé de faire quelque chose comme ça, mais je pense que ça ne devrait pas être trop difficile. Une alternative (et peut-être un peu plus facile) solution pourrait être de la sous-classe votre vue personnalisée racine de mise en page (comme si c'est un LinearLayout, faire un SquareLinearLayout), et de l'utiliser comme un conteneur à la place.
edit : Voici une implémentation de base qui semble fonctionner pour moi :
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); // Layout with max size
}
@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); // 2nd pass with the correct size
setMeasuredDimension(width, width);
}
}
Il est conçu pour avoir un enfant, mais je l'ai ignoré tous les contrôles pour des raisons de simplicité. L'idée de base est de mesurer l'enfant avec la largeur/hauteur des paramètres fixés par le contrôle GridView (dans mon cas, il utilise numColumns=4 pour calculer la largeur), et puis faire une deuxième passe, avec les dimensions finales, avec hauteur=largeur...
La mise en page est juste une simple mise en page, les mises en page qui l'enfant unique en (0, 0) avec les dimensions de votre choix (de droite à gauche, de bas en haut).
Et voici le code XML utilisé pour les éléments 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>
J'ai utilisé un LinearLayout à l'intérieur de la SquareView afin de gérer l'ensemble de la gravité des possibilités, les marges, etc.
Je ne suis pas sûr de savoir comment bien (ou mal) ce widget réagit à l'orientation et à la dimension des changements, mais il semble fonctionner correctement.