58 votes

mesurer une vue avant de la rendre

J'ai besoin de savoir comment grand d'un point de vue sera après l'avoir attaché à son parent.

J'ai annulé cette méthode:

onMeasure(int, int);

mais il semble que cette méthode est invoquée que lorsque j'ai fait ajouter à ma vue personnalisée pour il du conteneur à l'aide de:

addView(myView);

Pensez-vous qu'il est un moyen d'obtenir cette information avant le rendu de la vue elle-même? Essentiellement, j'ai besoin de savoir le actuall taille avant de l'attacher et de ne pas porter le point de vue à tous s'il prenait plus certaine quantité d'espace.

quelqu'un?

88voto

Dori Points 4011

Si vous souhaitez obtenir la largeur et la hauteur avant que votre activité a ajouté ça à son point de vue de la hiérarchie, mesuré et mis hors vous aurez à composer measure() sur le View vous-même avant d'appeler getMeasuredWidth() ou getMeasuredHeight().

Comme la largeur et la hauteur sont définies après la mesure a été appelé (qui à son tour appelle onMeasure()) ils seront de retour à 0 avant de ce point. Vous aurez à fournir MeasureSpecs pour measure(..) qui variera en fonction de vos besoins.

Le MeasureSpecs qui permettent aux enfants d'imposer des contraintes elles-mêmes ressemblent à des

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY);

Point Important. La largeur passé en ci-dessus peut être soit explicite px ou ViewGroup.LayoutParams.WRAP_CONTENT ou ViewGroup.LayoutParams.FILL_PARENT.

Il est aussi intéressant de noter que lorsque votre vision est mesurée dans la destination réelle de la hiérarchie de la MeasureSpec qui sera transmis à l' measure() sera configuré basé sur le contenant ViewGroups la logique de présentation. Il peut être appelé plus d'une fois si la première mesure de vals ne sont pas valides lorsqu'ils sont considérés dans le contexte de cette viewGroup parent / sa propre mise en page constraits / les contraintes de toute la fratrie de l'enfant-vues. Sans attendre l' viewGroup d'appel measure() avant la mise en œuvre de toute logique dépend de la taille mesurée, il serait dur (selon la situation) pour obtenir la valeur finale measuredWidth & height de la solution ci-dessus, mais dans tous les cas, j'ai utilisé la technique ci-dessus, il a fit l'objet, mais ils ont été relativement simple. Si vous avez vraiment besoin de mesurer dans le contexte, vous devriez probablement juste après l' onLayout() a retourné et explicitement toute modification puis requestLayout() de nouveau.

7voto

Prashast Points 4064

OnMeasure ne vous dis pas la taille de la Vue. Au lieu de cela, elle demande à votre Vue personnalisée pour définir sa taille en fournissant certaines contraintes appliquées par la Vue parent.

C'est à partir de la documentation du kit de développement:

La première paire est connu comme mesuré la largeur et la hauteur mesurée. Ces dimensions définir comment grand une vue veut à l'intérieur de ses parents (voir plan pour plus de détails.) La valeur mesurée les dimensions peuvent être obtenus en appelant le getMeasuredWidth() et getMeasuredHeight().

La seconde paire est simplement connu comme la largeur et la hauteur, ou parfois de dessin la largeur et la hauteur de dessin. Ces dimensions définir la taille réelle de la vue sur l'écran, au moment du dessin et après sa mise en page. Ces valeurs peuvent, mais n'ont pas à être différente de la largeur et la hauteur. L' la largeur et la hauteur peuvent être obtenus par l'appel de getWidth() et getHeight().

Après sa mise en page, vous pouvez appeler getWidth() et getHeight() pour trouver la taille finale de votre Vue personnalisée.

0voto

Dan2552 Points 520

J'ai le même problème. Je suppose que le seul moyen est de le rendre en premier, puis de le supprimer après s'il remplit la condition de taille. Cela semble un peu étrange, mais Android ne semble connaître les dimensions qu'après le dessin.

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