我们知道要在onCreate方法中知道某个View组件的宽度和高度等信息,而直接调用View组件的getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHeight()、getTop()、getLeft()等方法是无法获取到真实值的,只会得到0。这是因为View组件布局要在onResume回调后完成。下面提供实现方法,onGlobalLayout回调会在布局完成时自动调用,代码如下。
button2.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
//由于这里会被调用两次,我们只需用到一次,加个标志
boolean isFirst = true;
public void onGlobalLayout() {
if (isFirst) {
int width = button2.getWidth();
int height = button2.getHeight();
Log6.v("getViewTreeObserver获得---width:"+width+"---height:"+height);
isFirst = false;
}
}
});
另外还有一种方法可获得到,不过获取到的都是wrap_content的大小,代码如下。
public void measureView(View child) {
ViewGroup.LayoutParams p = child.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);
int lpHeight = p.height;
int childHeightSpec;
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,
MeasureSpec.EXACTLY);
} else {
childHeightSpec = MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
}
measureView(main_linear);
width = main_linear.getMeasuredWidth();
height = main_linear.getMeasuredHeight();