onCreate里面调用getWidth、getMeasuredWidth获得长宽值的,始终为0。在onCreate中。我们的控件事实上还并没有画好,换句话说,等onCreate方法运行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0。
方法一、
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
textView.measure(w, h);
int height = textView.getMeasuredHeight();
int width = textView.getMeasuredWidth();
方法二、
这种方法。我们须要注冊一个ViewTreeObserver的监听回调,这个监听回调,就是专门监听画图的,既然是监听画图,那么我们自然能够获取測量值了,同一时候。我们在每次监听前remove前一次的监听。避免反复监听。
final ViewTreeObserver vto = textView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
textView.getViewTreeObserver().removeOnPreDrawListener(this);
int height = textView.getMeasuredHeight();
int width = textView.getMeasuredWidth();
return true;
}
});
方法三、
这种方法于第2个方法基本同样,但他是全局的布局改变监听器,所以是最推荐使用的。
ViewTreeObserver vto1 = textView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int height = textView.getMeasuredHeight();
int width = textView.getMeasuredWidth();
}
});