Ich verwende a GridView
, um eine Reihe von Ansichten anzuzeigen, die im Wesentlichen sind LinearLayouts
. Ich möchte LinearLayouts
, dass alle quadratisch sind, aber ich möchte auch, dass sie dynamisch dimensioniert werden - das heißt, es gibt zwei Spalten, und ich möchte, dass sich die Spalten LinearLayouts
je nach Größe des Bildschirms dehnen, aber quadratisch bleiben. Gibt es eine Möglichkeit, dies über das xml
Layout zu tun, oder muss ich die Höhen und Breiten programmgesteuert einstellen?
84
Es könnte spät sein zu antworten, aber dennoch wird es für die neuen Besucher hilfreich sein.
Mit dem neuen ConstraintLayout das in Android Studio 2.3 eingeführt wurde, ist es jetzt ganz einfach, reaktionsschnelle Layouts zu erstellen.
Fügen Sie in einem übergeordneten ConstraintLayout dieses Attribut hinzu, damit eines der untergeordneten Elemente / Layouts dynamisch quadratisch ist
w gibt breitenbezogene Einschränkungen an und das Verhältnis 1: 1 sorgt für ein quadratisches Layout.
quelle
In der XML-Datei gibt es nichts, mit dem Sie die Eigenschaften width und height verknüpfen können. Wahrscheinlich ist es am einfachsten, Unterklassen zu erstellen
LinearLayout
und zu überschreibenonMeasure
Ich habe dies verwendet, um Ansichten zu erstellen, die vorher immer quadratisch sind. Es sollte immer noch funktionieren für eine
LinearLayout
.Weitere Informationen, die Ihnen dabei helfen: http://developer.android.com/guide/topics/ui/custom-components.html http://developer.android.com/reference/android/view/View.MeasureSpec.html
quelle
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
!super.onMeasure(widthMeasureSpec, widthMeasureSpec);
gibt Ihnen ein Quadrat, aber es ist immer Breite x Breite. Wenn die angegebenen Maße breiter als hoch sind, liegt ein Problem vor. Meine Lösung verwendet das kleinere der beiden Maße, sodass Sie immer das größte Quadrat erhalten, das in das angegebene Rechteck passt.Ich habe es so gemacht:
Bei dieser Implementierung ist Ihr Layout quadratisch, wobei die geringere Größe zwischen Breite und Höhe angenommen wird. Und es kann sogar mit dynamischen Werten festgelegt werden, z. B. mithilfe der Gewichtung in einem LinearLayout.
quelle
Wir können es auf sehr einfache Weise tun - rufen Sie einfach
super.onMeasure()
zweimal an.Durch
super.onMeasure()
zweimaliges Aufrufen ist dies im Hinblick auf den Zeichenprozess weniger effizient, aber es ist eine einfache Möglichkeit, Layoutprobleme zu beheben, die die anderen Antworten verursachen können.quelle
super.onMeasure()
zweimaliges Aufrufen wird sichergestellt, dass das Layout angesichts der neuen Größe der Ansicht korrekt ausgeführt wird. Ohne dies müssen wir ein Layout auf andere Weise auslösen oder mit falschen Layouts umgehen.Es ist so einfach wie:
quelle
Hier ist eine Lösung, die für alle Layoutparameter funktioniert, die auf Ansicht oder Ansichtsgruppe eingestellt werden können:
Prost
quelle
Mein Vorschlag ist, eine benutzerdefinierte Layoutklasse zu erstellen, die von FrameLayout erbt. Überschreiben Sie die OnMeasure () -Methode und fügen Sie das gewünschte Steuerelement in das SquareFrameLayout ein.
So wird es in Xamarin.Android gemacht:
Wenn Sie möchten, dass eine Ansicht (oder ein anderes Steuerelement) quadratisch (und zentriert) ist, fügen Sie sie einfach wie folgt zu Ihrem Layout hinzu:
quelle
Schauen Sie sich SquareLayout an , eine Android-Bibliothek die eine Wrapper-Klasse für verschiedene Layouts bereitstellt und diese quadratisch dimensioniert, ohne dass Kernfunktionen verloren gehen.
Die Bemaßungen werden unmittelbar vor dem Rendern des Layouts berechnet. Daher muss nach dem Abrufen der Ansicht kein erneutes Rendern oder ähnliches angepasst werden.
Um die Bibliothek zu verwenden, fügen Sie dies Ihrem build.gradle hinzu:
Das, was Sie benötigen, ist SquareLinearLayout .
quelle
Für alle, die eine Lösung suchen Mit Kotlin habe ich Folgendes gemacht
FrameLayout
.quelle
Versuchen Sie diesen Code:
quelle