Я не впевнений, що це можливо за допомогою поточних віджетів. Найкращою ставкою може бути розміщення власного подання у власному "SquareView". Цей вигляд міг містити лише 1 дочірній вигляд і примусити висоту дорівнювати ширині, коли викликається метод onLayout.
Я ніколи не намагався зробити щось подібне, але думаю, це не повинно бути надто складно. Альтернативним (і, можливо, дещо простішим) рішенням може бути підклас кореневого макета власного подання (наприклад, якщо це LinearLayout, зробити SquareLinearLayout) і використовувати його як контейнер.
редагувати: Ось основна реалізація, яка, здається, працює для мене:
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);
}
}
Він розроблений для того, щоб мати унікальну дитину, але я проігнорував усі перевірки заради простоти. Основна ідея полягає в тому, щоб виміряти дитину з параметрами ширини / висоти, встановленими 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, щоб він керував усіма гравітаційними можливостями, полями тощо.
Я не впевнений, наскільки добре (або погано) цей віджет реагуватиме на зміни орієнтації та розмірів, але, схоже, він працює коректно.