Forme simple de faire une mise en page dynamique mais carrée

J'utilise GridView pour afficher un tas de vues essentiellement LinearLayouts . Je veux que les LinearLayouts soient tous carrés, mais je veux aussi qu'ils soient de taille dynamique – c'est-à-dire, il y a deux colonnes et je veux que LinearLayouts s'étende en fonction de la taille de l'écran mais reste carré. Existe-t-il un moyen de le faire via la mise en page xml ou dois-je définir les hauteurs et les largeurs par programme?

  • Android: Réinitialisation de la position de l'animation après avoir terminé
  • Android Google Places remplit automatiquement les limites d'api ne fonctionnent pas
  • Obtenez une gamme de TOURS pour chaque élément sous jsonarray
  • Ne pas échouer à la compilation gradle si un test échoue avec gradle-android-test-plugin
  • Android: comment implémenter des vues et des vues dans un seul fichier xml
  • Android obtenez le chemin d'image à partir d'un dessin comme chaîne
  • 8 Solutions collect form web for “Forme simple de faire une mise en page dynamique mais carrée”

    Une solution soignée pour les éléments GridView carrés consiste à étendre RelativeLayout ou LinearLayout et à remplacer onMeasure comme onMeasure :

     @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); } 

    Il n'y a rien dans le xml qui vous permettra de lier les propriétés de largeur et de hauteur. Probablement la chose la plus simple à faire est de sous- LinearLayout et de remplacer onMeasure

     @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); int size = width > height ? height : width; setMeasuredDimension(size, size); } 

    J'ai utilisé cela pour créer des vues qui sont toujours carrées avant. Il devrait toujours fonctionner pour un LinearLayout .

    Plus d'informations qui aideront à faire ceci: http://developer.android.com/guide/topics/ui/custom-components.html http://developer.android.com/reference/android/view/View.MeasureSpec.html

    J'ai fait de cette façon:

     @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int size; if(widthMode == MeasureSpec.EXACTLY && widthSize > 0){ size = widthSize; } else if(heightMode == MeasureSpec.EXACTLY && heightSize > 0){ size = heightSize; } else{ size = widthSize < heightSize ? widthSize : heightSize; } int finalMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); super.onMeasure(finalMeasureSpec, finalMeasureSpec); } 

    Avec cette implémentation, votre mise en page sera carrée, en supposant la taille inférieure entre largeur et hauteur. Et il peut même être configuré avec des valeurs dynamiques, comme utiliser du poids dans un LinearLayout.

    Nous pouvons le faire de manière très simple ~ Appelez juste super.onMeasure () deux fois ~

     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = getMeasuredWidth(); int height = getMeasuredHeight(); int squareLen = width; if (height > width) { squareLen = height; } super.onMeasure(MeasureSpec.makeMeasureSpec(squareLen, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(squareLen, MeasureSpec.EXACTLY)); } 

    J'espère que cela vous aidera ~

    Il pourrait être tard pour répondre mais toujours, cela aidera les nouveaux visiteurs.

    Avec le nouveau ConstraintLayout introduit dans Android Studio 2.3, il est maintenant très facile de créer des mises en page réactives.

    Dans une condition de contrainte parentale, pour rendre l'affichage ou la configuration de ses enfants dynamiquement carrés, ajoutez cet attribut

     app:layout_constraintDimensionRatio="w,1:1" 

    W doit spécifier des contraintes de largeur et un rapport de 1: 1 assure une disposition carrée.

    Voici une solution qui fonctionne pour tous les paramètres de mise en page qui peuvent être configurés pour afficher ou afficher le groupe:

      int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); int widthDesc = MeasureSpec.getMode(widthMeasureSpec); int heightDesc = MeasureSpec.getMode(heightMeasureSpec); int size = 0; if (widthDesc == MeasureSpec.UNSPECIFIED && heightDesc == MeasureSpec.UNSPECIFIED) { size = DP(defaultSize); // Use your own default size, in our case // it's 125dp } else if ((widthDesc == MeasureSpec.UNSPECIFIED || heightDesc == MeasureSpec.UNSPECIFIED) && !(widthDesc == MeasureSpec.UNSPECIFIED && heightDesc == MeasureSpec.UNSPECIFIED)) { //Only one of the dimensions has been specified so we choose the dimension that has a value (in the case of unspecified, the value assigned is 0) size = width > height ? width : height; } else { //In all other cases both dimensions have been specified so we choose the smaller of the two size = width > height ? height : width; } setMeasuredDimension(size, size); 

    À votre santé

    Ma suggestion est de créer une classe de mise en page personnalisée qui hérite de FrameLayout. Remplacez la méthode OnMeasure () et mettez le contrôle que vous voulez être carré dans cet outil SquareFrameLayout.

    C'est ainsi que cela se fait dans Xamarin.Android:

     public class SquareFrameLayout : FrameLayout { private const string _tag = "SquareFrameLayout"; public SquareFrameLayout(Android.Content.Context context):base(context) {} public SquareFrameLayout(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer):base(javaReference, transfer) {} public SquareFrameLayout(Android.Content.Context context, IAttributeSet attrs):base(context, attrs) {} public SquareFrameLayout(Android.Content.Context context, IAttributeSet attrs, int defStyleAttr):base(context, attrs, defStyleAttr) {} public SquareFrameLayout(Android.Content.Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes):base(context, attrs, defStyleAttr, defStyleRes) {} protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) { var widthMode = MeasureSpec.GetMode(widthMeasureSpec); int widthSize = MeasureSpec.GetSize(widthMeasureSpec); var heightMode = MeasureSpec.GetMode(heightMeasureSpec); int heightSize = MeasureSpec.GetSize(heightMeasureSpec); int width, height; switch (widthMode) { case MeasureSpecMode.Exactly: width = widthSize; break; case MeasureSpecMode.AtMost: width = Math.Min(widthSize, heightSize); break; default: width = 100; break; } switch (heightMode) { case MeasureSpecMode.Exactly: height = heightSize; break; case MeasureSpecMode.AtMost: height = Math.Min(widthSize, heightSize); break; default: height = 100; break; } Log.Debug(_tag, $"OnMeasure({widthMeasureSpec}, {heightMeasureSpec}) => Width mode: {widthMode}, Width: {widthSize}/{width}, Height mode: {heightMode}, Height: {heightSize}/{height}"); var size = Math.Min(width, height); var newMeasureSpec = MeasureSpec.MakeMeasureSpec(size, MeasureSpecMode.Exactly); base.OnMeasure(newMeasureSpec, newMeasureSpec); } } 

    Si vous souhaitez que la vue (ou tout autre contrôle) soit carrée (et centrée), ajoutez-la à votre mise en page de la manière suivante:

     <your.namespace.SquareFrameLayout android:id="@+id/squareContainer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center"> <View android:id="@+id/squareContent" android:layout_width="match_parent" android:layout_height="match_parent" /> </your.namespace.SquareFrameLayout> 

    C'est aussi simple que:

     public class SquareRelativeLayout extends RelativeLayout { public SquareRelativeLayout(Context context) { super(context); } public SquareRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (widthMeasureSpec < heightMeasureSpec) super.onMeasure(widthMeasureSpec, widthMeasureSpec); else super.onMeasure(heightMeasureSpec, heightMeasureSpec); } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.