【情景】 有時(shí)候需要在onCreate方法中知道某個(gè)View組件的寬度和高度等信息孤荣,而直接調(diào)用View組件的getWidth()甸陌、getHeight()须揣、getMeasuredWidth()、getMeasuredHeight()钱豁、getTop()耻卡、getLeft()等方法是無(wú)法獲取到真實(shí)值的,只會(huì)得到0牲尺。
【友情鏈接】 http://blog.csdn.net/linghu_java/article/details/46544811
【原因】 ? 因?yàn)閂iew組件布局要在onResume回調(diào)后完成卵酪。所以現(xiàn)在需要使getViewTreeObserver().addOnGlobalLayoutListener()來(lái)獲得寬度或者高度。這是獲得一個(gè)view的寬度和高度的方法之一谤碳。
OnGlobalLayoutListener 是ViewTreeObserver的內(nèi)部類(lèi)溃卡,當(dāng)一個(gè)視圖樹(shù)的布局發(fā)生改變時(shí),可以被ViewTreeObserver監(jiān)聽(tīng)到估蹄,這是一個(gè)注冊(cè)監(jiān)聽(tīng)視圖樹(shù)的觀察者(observer)塑煎,在視圖樹(shù)的全局事件改變時(shí)得到通知。ViewTreeObserver不能直接實(shí)例化臭蚁,而是通過(guò)getViewTreeObserver( )獲得最铁。
【代碼實(shí)現(xiàn)】
int mHeaderViewHeight;
mHeaderView.getViewTreeObserver( ).addOnGlobalLayoutListener(
? ? ? ? new OnGlobalLayoutListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onGlobalLayout() {
? ? ? ? ? ? ? ? mHeaderViewHeight = mHeaderView.getHeight();
? ? ? ? ? ? ? ? ? getViewTreeObserver() .removeGlobalOnLayoutListener(this);
? ? ? ? ? ? }
? ? ? ? });
【注】 ?但是需要注意的是OnGlobalLayoutListener可能會(huì)被多次觸發(fā),因此在得到了高度之? 后垮兑,要將OnGlobalLayoutListener注銷(xiāo)掉冷尉。
除了OnGlobalLayoutListener ,ViewTreeObserver還有如下內(nèi)部類(lèi):1) interface ViewTreeObserver.OnGlobalFocusChangeListener
? ? ? ? 當(dāng)在一個(gè)視圖樹(shù)中的焦點(diǎn)狀態(tài)發(fā)生改變時(shí)系枪,所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
(2)interface? ViewTreeObserver.OnGlobalLayoutListener
當(dāng)在一個(gè)視圖樹(shù)中全局布局發(fā)生改變或者視圖樹(shù)中的某個(gè)視圖的可視狀態(tài)發(fā)生改變時(shí)雀哨,所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
(3)interface ViewTreeObserver.OnPreDrawListener
當(dāng)一個(gè)視圖樹(shù)將要繪制時(shí),所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
(4) interface? ViewTreeObserver.OnScrollChangedListener
當(dāng)一個(gè)視圖樹(shù)中的一些組件發(fā)生滾動(dòng)時(shí)私爷,所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
(5)interface? ViewTreeObserver.OnTouchModeChangeListener
當(dāng)一個(gè)視圖樹(shù)的觸摸模式發(fā)生改變時(shí)雾棺,所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)