天天看點

fragment中擷取控件的寬和高的方法

轉自: http://bbs.csdn.net/topics/390672372

有時候我們需要獲得控件的大小,但是在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.     public boolean onPreDraw() {  
  4.         if (!isMeasured) {  
  5.             int layoutHeight = layoutIndex.getMeasuredHeight();  
  6.             isMeasured = true;  
  7.         }  
  8.         return true;  
  9.     }  
  10. });  

[java]  view plain  copy

  1. ViewTreeObserver observer = view.getViewTreeObserver();  
  2. observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {  
  3.     public boolean onPreDraw() {  
  4.         if (!isMeasured) {  
  5.             int viewHeight = layoutIndex.getMeasuredHeight();  
  6.             isMeasured = true;  
  7.         }  
  8.         return true;  
  9.     }  
  10. });  

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

Java代碼 

  1. interface ViewTreeObserver.OnPreDrawListener  
  2. interface ViewTreeObserver.OnGlobalFocusChangeListener  
  3. interface ViewTreeObserver.OnGlobalLayoutListener  
  4. interface ViewTreeObserver.OnScrollChangedListener  
  5. interface ViewTreeObserver.OnTouchModeChangeListener  

    來源: http://blog.csdn.net/yuyuhuihui/article/details/45021741

ViewTreeObserver vto = view.getViewTreeObserver();

vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

// TODO 自動生成的方法存根

int viewWidth = view.getWidth();

}

});

繼續閱讀