轉自: http://bbs.csdn.net/topics/390672372
有時候我們需要獲得控件的大小,但是在Activity的onCreate()生命周期方法中調用getWidth()和getHeight()方法并不能獲得控件的寬和高,因為此時我們的界面并未被繪制完成。不過我們卻可以在onWindowFocusChanged(boolean hasFocus)這個方法中獲得控件的大小。
Java代碼
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- int height = titleLeftBtn.getHeight();
- int width = titleLeftBtn.getWidth();
- }
目前視窗的Activity在獲得或者失去焦點的時候就會調用這個方法,它是這個Activity是否對使用者可見的最好标志。
那麼對于Fragment又該怎麼辦呢?Fragment并未提供類似onWindowFocusChanged的方法。這時我們就需要用到ViewTreeObserver了。
Java代碼
- ViewTreeObserver observer = layoutIndex.getViewTreeObserver();
- observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
- public boolean onPreDraw() {
- if (!isMeasured) {
- int layoutHeight = layoutIndex.getMeasuredHeight();
- isMeasured = true;
- }
- return true;
- }
- });
[java] view plain copy
- ViewTreeObserver observer = view.getViewTreeObserver();
- observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
- public boolean onPreDraw() {
- if (!isMeasured) {
- int viewHeight = layoutIndex.getMeasuredHeight();
- isMeasured = true;
- }
- return true;
- }
- });
顧名思義,這是個對視圖變化進行監聽的觀察者。提供了以下接口,大家可以自己試着測試一下。
Java代碼
- interface ViewTreeObserver.OnPreDrawListener
- interface ViewTreeObserver.OnGlobalFocusChangeListener
- interface ViewTreeObserver.OnGlobalLayoutListener
- interface ViewTreeObserver.OnScrollChangedListener
-
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();
}
});