Я не уверен, что это возможно с текущими виджетами.Лучше всего было бы поместить свой пользовательский вид в пользовательский "SquareView".Это представление может содержать только 1 дочернее представление и принудительно устанавливать высоту равной ширине при вызове его метода onLayout.
Я никогда не пытался сделать что-то подобное, но я думаю, что это не должно быть слишком сложно.Альтернативное (и, возможно, немного более простое) решение может заключаться в создании подкласса корневого макета вашего пользовательского представления (например, если это LinearLayout, создание SquareLinearLayout) и использовании его вместо контейнера.
edit: вот базовыйреализация, которая, кажется, работает для меня:
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);
}
}
Она предназначена для того, чтобы иметь уникального потомка, но я упустил все проверки ради простоты.Основная идея состоит в том, чтобы измерить дочерний элемент с параметрами ширины / высоты, установленными GridView (в моем случае он использует numColumns = 4 для вычисления ширины), а затем выполнить второй проход с окончательными размерами, при этом высота = ширина... Макет представляет собой просто простой макет, который размещает уникальный дочерний элемент в (0, 0) с желаемыми размерами (справа налево, вниз).
А вот XML, используемый для элементов 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>
Я использовал LinearLayout внутри SquareView, чтобы он управлял всеми возможностями гравитации, полями и т. Д.
Я не уверен, насколько хорошо (или плохо) этоВиджет будет реагировать на изменения ориентации и размеров, но, похоже, он работает правильно.