2010-05-13 112 views
51

我需要找出在将视图附加到其父项之后视图有多大。在渲染之前测量视图

我已经重写了这个方法:

onMeasure(int, int); 

但用貌似只有当我在我的自定义视图实际添加到它调用此方法的容器:

addView(myView); 

你觉得有在呈现视图本身之前获取此信息的方法?基本上我需要知道真正的大小,然后再附加它,如果需要更多的空间,就不要附加视图。

有人吗?

回答

7

OnMeasure不会告诉你的视图的大小。相反,它会要求您的自定义视图通过提供由父视图执行的某些约束来设置其大小。

这是来自SDK文档:

第一对被称为测量 宽度和测得的高度。这些 尺寸定义视图多大希望 成为其父项内(参见布局 更多的细节。)所测得的尺寸 可以通过调用 getMeasuredWidth()和 getMeasuredHeight()来获得。

第二对简单地称为 宽度和高度,或有时绘制 宽度和绘图高度。这些尺寸在屏幕上,在绘制时间 和布局之后定义实际尺寸 。这些值可能是 ,但不一定要与 的测量宽度和高度不同。通过调用getWidth()和getHeight(),可以获得 的宽度和高度,其中 。

布局后,您可以调用getWidth()和getHeight()来查找自定义视图的最终大小。

0

我遇到同样的问题。我想唯一的办法是先渲染它,然后如果符合大小条件,则在之后将其删除。似乎有点奇怪,但Android似乎只知道绘制后的尺寸。

82

如果你想获得你的活动之前的宽度和高度已经把它添加到它的视图层次,测量和布置它,你将不得不呼吁View自己measure()调用getMeasuredWidth()getMeasuredHeight()之前。

由于测量的宽度和高度是在度量被调用后设置的(它又调用onMeasure()),它们将在此点之前返回0。您将不得不提供MeasureSpec s到measure(..),这将根据您的需求而有所不同。

,让孩子们施加任何限制的MeasureSpecs自己看起来像

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

重要的一点(已经在新的API被改变) 在上面通过的宽度可以是显式的像素或 ViewGroup.LayoutParams.WRAP_CONTENTViewGroup.LayoutParams.FILL_PARENT.

其还值得当你的视图,在实际目标层级将被传递的MeasureSpec测量提到measure()将基于包含ViewGroups布局逻辑配置。如果在此父视图组/其自己的布局约束/任何同级子视图的约束条件下考虑时,可能会多次调用第一个度量值val。没有等待viewGroup调用measure()在实现依赖于测量大小的任何逻辑之前,从上述解决方案获得最终measuredWidth & height将是困难的(取决于情况),但是在所有情况下,我已经使用了上述技术符合目的,但它们相对简单。如果您确实需要在上下文中进行衡量,则应该在onLayout()已返回并且明确设置了任何更改,然后再次requestLayout()之后执行。

+4

重要的一点是错误的,您不能将WRAP_CONTENT或FILL_PARENT作为makeMeasureSpec(int,int)的第一个参数传递。该值必须大于0或小于1073741823. – worked 2016-07-31 00:02:23

+2

似乎像这种方法impl改为17.我回答了近5年前:) – Dori 2016-08-01 18:32:35

+0

@Dori文档[** MeasureSpec.makeMeasureSpec()**](https ://developer.android.com/reference/android/view/View.MeasureSpec.html)已经更新,以反映新的限制。你介意在这个“重要的一点”部分放置一个穿透或其他东西吗? – 2016-10-13 00:54:03