Ich bin mir nicht sicher, ob dies mit den aktuellen Widgets möglich ist. Am besten fügen Sie Ihre benutzerdefinierte Ansicht in eine benutzerdefinierte "SquareView" ein. Diese Ansicht kann nur eine untergeordnete Ansicht enthalten und die Höhe so erzwingen, dass sie der Breite entspricht, wenn die onLayout-Methode aufgerufen wird.
Ich habe nie versucht, so etwas zu tun, aber ich denke, es sollte nicht zu schwierig sein. Eine alternative (und möglicherweise etwas einfachere) Lösung könnte darin bestehen, das Stammlayout Ihrer benutzerdefinierten Ansicht in Unterklassen zu unterteilen (z. B. wenn es sich um ein LinearLayout handelt, ein SquareLinearLayout zu erstellen) und dieses stattdessen als Container zu verwenden.
edit: Hier ist eine grundlegende Implementierung, die für mich zu funktionieren scheint:
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);
}
}
Es ist so konzipiert, dass es ein einzigartiges Kind hat, aber ich habe der Einfachheit halber alle Überprüfungen ignoriert. Die Grundidee besteht darin, das untergeordnete Element mit den von GridView festgelegten Breiten- / Höhenparametern zu messen (in meinem Fall wird numColumns = 4 zur Berechnung der Breite verwendet) und anschließend einen zweiten Durchgang mit den endgültigen Abmessungen mit height = width durchzuführen. .. Das Layout ist nur ein einfaches Layout, das das eindeutige untergeordnete Element bei (0, 0) mit den gewünschten Abmessungen (rechts-links, unten-oben) anordnet.
Und hier ist das XML, das für die GridView-Elemente verwendet wird:
<?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>
Ich habe ein LinearLayout in SquareView verwendet, damit es alle Schwerkraftmöglichkeiten, Ränder usw. verwaltet.
Ich bin nicht sicher, wie gut (oder schlecht) dieses Widget auf Orientierungs- und Dimensionsänderungen reagieren würde, aber es scheint richtig zu funktionieren.