1. 程式人生 > >fragment中獲取控制元件的寬和高的方法

fragment中獲取控制元件的寬和高的方法

有時候我們需要獲得控制元件的大小,但是在Activity的onCreate()生命週期方法中呼叫getWidth()和getHeight()方法並不能獲得控制元件的寬和高,因為此時我們的介面並未被繪製完成。不過我們卻可以在onWindowFocusChanged(boolean hasFocus)這個方法中獲得控制元件的大小。

Java程式碼  
  1. @Override  
  2. public void onWindowFocusChanged(boolean hasFocus) {  
  3.     super.onWindowFocusChanged(hasFocus);  
  4.     int height = titleLeftBtn.getHeight();  
  5.     int width = titleLeftBtn.getWidth();  
  6. }  

當前視窗的Activity在獲得或者失去焦點的時候就會呼叫這個方法,它是這個Activity是否對使用者可見的最好標誌。 
那麼對於Fragment又該怎麼辦呢?Fragment並未提供類似onWindowFocusChanged的方法。這時我們就需要用到ViewTreeObserver了。 

Java程式碼  
  1. ViewTreeObserver observer = layoutIndex.getViewTreeObserver();  
  2. observer.addOnPreDrawListener(new
     ViewTreeObserver.OnPreDrawListener() {  
  3.     publicboolean onPreDraw() {  
  4.         if (!isMeasured) {  
  5.             int layoutHeight = layoutIndex.getMeasuredHeight();  
  6.             isMeasured = true;  
  7.         }  
  8.         returntrue;  
  9.     }  
  10. });  
  1. ViewTreeObserver observer = view.getViewTreeObserver();  
  2. observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {  
  3.     publicboolean onPreDraw() {  
  4.         if (!isMeasured) {  
  5.             int viewHeight = layoutIndex.getMeasuredHeight();  
  6.             isMeasured = true;  
  7.         }  
  8.         returntrue;  
  9.     }  
  10. });  


顧名思義,這是個對檢視變化進行監聽的觀察者。提供了以下介面,大家可以自己試著測試一下。 

Java程式碼  
  1. interface ViewTreeObserver.OnPreDrawListener  
  2. interface ViewTreeObserver.OnGlobalFocusChangeListener  
  3. interface ViewTreeObserver.OnGlobalLayoutListener  
  4. interface ViewTreeObserver.OnScrollChangedListener  
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override
public void onGlobalLayout() {
// TODO 自動生成的方法存根
int viewWidth = view.getWidth();
}
});