2010-05-13 17 views
51

Necesito averiguar qué tan grande será una vista después de conectarla a su matriz.midiendo una vista antes de representarla

me han anulado este método:

onMeasure(int, int); 

pero parece que este método se invoca sólo cuando realmente añadir mi vista personalizada para él es envase usando:

addView(myView); 

¿Cree que existe una forma de obtener esta información antes de representarla? Básicamente, necesito saber el tamaño real antes de conectarlo y no adjuntar la vista en absoluto si se necesita más cantidad de espacio.

alguien?

Respuesta

7

OnMeasure no te dice el tamaño de la vista. En su lugar, le pide a su Vista personalizada que configure su tamaño al proporcionar algunas restricciones impuestas por la Vista principal.

Esto es de la documentación SDK:

El primer par se conoce como medido anchura y la altura medida. Estas dimensiones definen qué tan grande una vista quiere estar dentro de su matriz (ver Disposición para más detalles.) Las medidas dimensiones se pueden obtener llamando getMeasuredWidth() y getMeasuredHeight().

El segundo par se conoce simplemente como ancho y alto , o en ocasiones dibujando ancho y alto de dibujo. Estas dimensiones definen el tamaño real de la vista en la pantalla, en el momento del dibujo y después del diseño. Estos valores pueden, pero no tienen que ser, ser diferentes de el ancho y la altura medidos. El ancho y alto se puede obtener llamando al llamando a getWidth() y getHeight().

Después del diseño, puede llamar a getWidth() y getHeight() para encontrar el tamaño final de su vista personalizada.

0

Estoy teniendo el mismo problema. Supongo que la única forma es renderizarlo primero, luego eliminarlo después de si cumple con las condiciones de tamaño. Parece un poco extraño, pero Android solo parece conocer las dimensiones después del dibujo.

82

Si desea obtener el ancho y la altura antes de que su actividad ha añadido a su jerarquía de vistas, se mide y se presentarán a cabo tendrá que llamar measure() en el View a sí mismo antes de llamar getMeasuredWidth() o getMeasuredHeight().

Como el ancho y la altura medidos se configuran después de haber llamado a la medida (que a su vez llama a onMeasure()), devolverán 0 antes de este punto. Deberá suministrar MeasureSpec s al measure(..) que variará según sus necesidades.

Los MeasureSpecs que permiten a los niños a imponer limitaciones a sí mismos se ven como

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

punto importante. (se ha cambiado en la nueva API) El ancho pasado en el anterior puede ser o bien px explícita o ViewGroup.LayoutParams.WRAP_CONTENT o ViewGroup.LayoutParams.FILL_PARENT.

También debe notarse cuando su vista se mide en la jerarquía de destino real del MeasureSpec que será pasado a measure() se configurará según la lógica de diseño ViewGroups. Se puede invocar más de una vez si los primeros vals de medida no son válidos cuando se consideran en el contexto de este padre viewGroup/its own layout constraits/the constraints de cualquier hermano child-views. Sin esperar que viewGroup llame al measure() antes de implementar cualquier lógica dependiente del tamaño medido, sería difícil (dependiendo de la situación) obtener el measuredWidth & height final de la solución anterior, pero en todas las instancias he utilizado la técnica anterior que tiene se ajustan al propósito, pero han sido relativamente simples. Si realmente necesita medir en contexto, probablemente debería hacerlo después de que onLayout() haya regresado y explícitamente establecer cualquier cambio, luego requestLayout() nuevamente.

+4

Su punto importante es incorrecto, no puede pasar WRAP_CONTENT o FILL_PARENT como el primer parámetro de makeMeasureSpec (int, int). El valor debe ser mayor que 0 o menor que 1073741823. – worked

+2

Parece que este método impl cambió a los 17. Respondí esto hace casi 5 años :) – Dori

+0

@Dori los documentos para [** MeasureSpec.makeMeasureSpec() **] (https : //developer.android.com/reference/android/view/View.MeasureSpec.html) también se han actualizado para reflejar las nuevas restricciones. ¿Te importaría poner un tachado o algo en esa sección de "punto importante"? –

Cuestiones relacionadas