Définition d’une largeur maximale sur un ViewGroup

Comment définir la largeur maximale d’un ViewGroup? J’utilise une activité Theme.Dialog , cependant, cela n’a pas l’air si bon quand redimensionnée à des écrans plus grands, c’est aussi une sorte de léger et je ne veux pas qu’il occupe tout l’écran.

J’ai essayé cette suggestion en vain. En outre, il n’y a pas de propriété android:maxWidth comme certaines vues.

Existe-t-il un moyen de restreindre la racine LinearLayout pour qu’elle ne soit que (par exemple) 640 dip? Je suis disposé à changer pour un autre ViewGroup.

Aucune suggestion?

Une option qui est ce que j’ai fait est d’étendre LinearLayout et de remplacer la fonction onMeasure. Par exemple:

 public class BoundedLinearLayout extends LinearLayout { private final int mBoundedWidth; private final int mBoundedHeight; public BoundedLinearLayout(Context context) { super(context); mBoundedWidth = 0; mBoundedHeight = 0; } public BoundedLinearLayout(Context context, AtsortingbuteSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAtsortingbutes(attrs, R.styleable.BoundedView); mBoundedWidth = a.getDimensionPixelSize(R.styleable.BoundedView_bounded_width, 0); mBoundedHeight = a.getDimensionPixelSize(R.styleable.BoundedView_bounded_height, 0); a.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Adjust width as necessary int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); if(mBoundedWidth > 0 && mBoundedWidth < measuredWidth) { int measureMode = MeasureSpec.getMode(widthMeasureSpec); widthMeasureSpec = MeasureSpec.makeMeasureSpec(mBoundedWidth, measureMode); } // Adjust height as necessary int measuredHeight = MeasureSpec.getSize(heightMeasureSpec); if(mBoundedHeight > 0 && mBoundedHeight < measuredHeight) { int measureMode = MeasureSpec.getMode(heightMeasureSpec); heightMeasureSpec = MeasureSpec.makeMeasureSpec(mBoundedHeight, measureMode); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

Ensuite, XML utilisera la classe personnalisée:

    

Et l'entrée du fichier attr.xml

     

EDIT: C'est le code que j'utilise actuellement. Ceci n'est toujours pas complet mais fonctionne dans la plupart des cas.

En me basant sur la réponse originale de Chase (+1), je voudrais apporter quelques modifications (décrites ci-dessous).

  1. J’aurais la largeur maximale définie via un atsortingbut personnalisé (xml sous le code)

  2. J’appellerais super.measure() abord et ensuite la Math.min(*) . En utilisant le code de réponses d’origine, nous pouvons rencontrer des problèmes lorsque la taille entrante définie dans le MeasureSpec est LayoutParams.WRAP_CONTENT ou LayoutParams.FILL_PARENT . Comme ces constantes valides ont des valeurs respectives de -2 et -1 , le Math.min(*) devient inutile car il conservera ces valeurs sur la taille maximale et indiquera que le WRAP_CONTENT mesuré est plus grand que notre taille maximale. attrape ça. J’imagine que l’OP ne pensait aux dims exacts (pour lesquels cela fonctionne très bien)

     public class MaxWidthLinearLayout extends LinearLayout { private int mMaxWidth = Integer.MAX_VALUE; public MaxWidthLinearLayout(Context context) { super(context); } public MaxWidthLinearLayout(Context context, AtsortingbuteSet attrs) { super(context, attrs); TypedArray a = getContext().obtainStyledAtsortingbutes(attrs, R.styleable.MaxWidthLinearLayout); mMaxWidth = a.getDimensionPixelSize(R.styleable.MaxWidthLinearLayout_maxWidth, Integer.MAX_VALUE); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //get measured height if(getMeasuredWidth() > mMaxWidth){ setMeasuredDimension(mMaxWidth, getMeasuredHeight()); } } } 

et l’atsortingbut xml

      

Voici un meilleur code pour la réponse de Dori.

Dans la méthode onMeasure , si vous appelez super.onMeasure(widthMeasureSpec, heightMeasureSpec); Tout d’abord, dans la méthode, la largeur de tous les objects dans la mise en page ne sera pas modifiée. Parce qu’ils ont initialisé avant de définir la largeur de la mise en page (parent).

 public class MaxWidthLinearLayout extends LinearLayout { private final int mMaxWidth; public MaxWidthLinearLayout(Context context) { super(context); mMaxWidth = 0; } public MaxWidthLinearLayout(Context context, AtsortingbuteSet attrs) { super(context, attrs); TypedArray a = getContext().obtainStyledAtsortingbutes(attrs, R.styleable.MaxWidthLinearLayout); mMaxWidth = a.getDimensionPixelSize(R.styleable.MaxWidthLinearLayout_maxWidth, Integer.MAX_VALUE); a.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); if (mMaxWidth > 0 && mMaxWidth < measuredWidth) { int measureMode = MeasureSpec.getMode(widthMeasureSpec); widthMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, measureMode); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

Et voici un lien pour l'utilisation de xml attr:
http://kevindion.com/2011/01/custom-xml-atsortingbutes-for-android-widgets/

Merci pour cette question et réponses. Votre réponse m'a beaucoup aidé et j'espère que cela aidera également quelqu'un d'autre à l'avenir.

Maintenant, android.support.constraint.ConstraintLayout facilite les choses. Enveloppez simplement votre vue (de n’importe quel type) avec ConstraintLayout et définissez les atsortingbuts suivants sur la vue:

 android:layout_width="0dp" app:layout_constraintWidth_default="spread" app:layout_constraintWidth_max="640dp" 

http://tools.android.com/recent/constraintlayoutbeta5isnowavailable

Ajoutez un calque de disposition externe ou de groupe de vues à votre fichier de mise en forme actuel. La hauteur et la largeur de cette disposition correspondront à la hauteur / largeur maximale. Maintenant, votre disposition interne peut être définie pour envelopper le contenu et est limitée par la disposition externe. Par exemple:

        

Voici une réponse simple,

La largeur / hauteur semble toujours devoir être définie ensemble. Cela fonctionne à mon avis.

   

Le parent du bouton est configuré pour envelopper le contenu, ce qui permet de le réduire, mais jusqu’à un maximum de 400 en largeur (4 boutons).