109 votes

Comment la taille de vue Android basé sur son parent ' dimensions de s

Comment est-ce que je peux taille un affichage basé sur la taille de sa mise en page parent. Par exemple, j’ai un relativelayout qui remplit l’écran complet, et je veux une vue enfant, dire une imageview, pour occuper toute la hauteur et 1/2 la largeur ?

J’ai essayé de la substitution de tous sur onMeasu onLayout onSizeChanged etc. et je ne pouvais pas le faire fonctionner...

124voto

Vic Points 2129

Je ne sais pas si quelqu'un est encore la lecture de ce thread ou pas, mais Jeff solution ne fera que vous obtenez à mi-chemin (un peu littéralement). Ce que son onMeasure va faire, c'est afficher la moitié de l'image dans la moitié de la mère. Le problème, c'est que l'appel à super.onMeasure avant l' setMeasuredDimension permettra de mesurer tous les enfants dans la vue en fonction de la taille originale, puis il suffit de couper la vue de moitié lorsque l' setMeasuredDimension redimensionnée.

Au lieu de cela, vous devez appeler setMeasuredDimension (pour un onMeasure remplacer) et de fournir un nouveau LayoutParams de votre point de vue, alors appelez super.onMeasure. Rappelez-vous, votre LayoutParams sont dérivées à partir de votre point de vue du type parent, pas votre point de vue.

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
   int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
   int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
   this.setMeasuredDimension(parentWidth/2, parentHeight);
   this.setLayoutParams(new *ParentLayoutType*.LayoutParams(parentWidth/2,parentHeight));
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Je crois que la seule fois où vous aurez des problèmes avec le parent LayoutParams si le parent est un AbsoluteLayout (qui est obsolète mais encore parfois utile).

43voto

Jeff Points 436

Vous pouvez résoudre ce problème en créant un affichage personnalisé et substituez la méthode onMeasure(). Si vous utilisez toujours « fill_parent » pour le layout_width dans votre fichier xml, puis le paramètre widthMeasureSpec qui est passé dans la méthode onMeasusre() doit contenir la largeur du parent.

Votre fichier XML pourrait ressembler à ceci :

29voto

Phil Kulak Points 1813

J'ai trouvé qu'il est préférable de ne pas déconner avec réglage de l'mesuré les dimensions de vous-même. Il y a effectivement un peu de négociation qui se passe entre le parent et l'enfant, points de vue et vous ne voulez pas de ré-écrire ce code:

http://developer.android.com/guide/topics/ui/how-android-draws.html

Ce que vous pouvez faire, cependant, est de modifier le measureSpecs, puis d'appeler super avec eux. Votre vue ne saura jamais que c'est une modification de message à partir de son parent et de prendre soin de tout pour vous:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    int myWidth = (int) (parentHeight * 0.5);
    super.onMeasure(MeasureSpec.makeMeasureSpec(myWidth, MeasureSpec.EXACTLY), heightMeasureSpec);
}

17voto

Cheryl Simon Points 25259

Lorsque vous définissez une mise en page et vue sur le format XML, vous pouvez spécifier la mise en page de largeur et de hauteur de vue pour être enveloppement de contenu, ou de remplir parent. En prenant la moitié de la zone est un peu plus difficile, mais si vous aviez quelque chose que vous voulais sur l'autre moitié, vous pourriez faire quelque chose comme ce qui suit.

   <LinearLayout android:layout_width="fill_parent"
                android:layout_height="fill_parent">
        <ImageView android:layout_height="fill_parent"
                 android:layout_width="0dp"
                 android:layout_weight="1"/>
        <ImageView android:layout_height="fill_parent"
                 android:layout_width="0dp"
                 android:layout_weight="1"/>
   </LinearLayout>

Deux choses le même poids signifie qu'ils vont s'étirer pour prendre la même proportion de l'écran. Pour plus d'informations sur les modèles, voir le dev docs.

9voto

pinkwerther Points 136

Je crois que Mayras XML-approche http://stackoverflow.com/a/2159486/1162415 peut être soignée. Toutefois, il est possible de le rendre plus précis, avec un point de vue uniquement en définissant le weightSum. J’ai pas appellerais cela un hack plus mais à mon avis, l’approche plus simple :

Comme ça vous pouvez utiliser n’importe quel poids, 0,6 par exemple (et centrage) est le poids que je souhaite utiliser pour les boutons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X