在onCreate()里面獲取控件的高度是0,那是因為當onCreate方法執行完以后,我們定義的控件才會被度量(measure),所以我們在onCreate方法里面通過view.getHeight()獲取控件的高度或者寬度是0。
方法一:
1 int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 2 int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 3 mView.measure(w, h); 4 int height =mView.getMeasuredHeight(); 5 int width =mView.getMeasuredWidth();
方法二:
1 ViewTreeObserver vto = mView.getViewTreeObserver(); 2 vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 3 public boolean onPreDraw() { 4 int height = mView.getMeasuredHeight(); 5 int width = mView.getMeasuredWidth(); 6 return true; 7 } 8 });
方法三:
1 ViewTreeObserver vto2 = mView.getViewTreeObserver(); 2 vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 3 @Override 4 public void onGlobalLayout() { 5 mView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 6 } 7 });
總結:那么需要獲取控件的寬高該用那個方法呢?
方法一:比其他的兩個方法多了一次計算,也就是多調用了一次onMeasure()方法,該方法雖然看上去簡單,但是如果要目標控件計算耗時比較大的話,不見時使用,如listView等。
方法二:它的回調方法會調用很多次,所以不建議使用。
方法三:比較合適。
當然,實際應用的時候需要根據實際情況而定。