當(dāng)我們?cè)趏ncreate 調(diào)用 getwith() 與 getheigh()時(shí)返回0 的緣由是我們的view 在此時(shí)還沒有繪制出來,不光在oncreate .Activity生命周期中,onStart,onResume,onCreate都不是真正visible的時(shí)間點(diǎn),真實(shí)的visible時(shí)間點(diǎn)是onWindowFocusChanged()函數(shù)被履行時(shí)。
所以1個(gè)解決方法:
就是將 getwith放到onWindowFocusChanged()中。這個(gè)onWindowFocusChanged指的是這個(gè)Activity得到或失去焦點(diǎn)的時(shí)候 就會(huì)就會(huì)被調(diào)用。
另外一個(gè)方法是在oncreate 注冊(cè)1個(gè)viewTreeObserver的監(jiān)聽器,監(jiān)聽view的繪制情況。這是1個(gè)注冊(cè)監(jiān)聽視圖樹的視察者(observer),在視圖樹種全局事件改變時(shí)得到通知。這個(gè)全局事件不但還包括全部樹的布局,從繪畫進(jìn)程開始,觸摸模式的改變等。ViewTreeObserver不能夠被利用程序?qū)嵗捎谒怯梢晥D提供。
他提供了很多監(jiān)聽器,具體見:http://www.cnblogs.com/xingfuzzhd/archive/2013/06/25/3154674.html
我們這里用下面這個(gè)就行:
//這類可以在外層布局完成時(shí)動(dòng)態(tài)加載里面的布局
/**out_layout是img_barde,tv_title,img_author,的外層layout,在外層布局加載完成后根據(jù)img_barde,tv_title的高寬動(dòng)態(tài)繪制img_author的布局*/
ViewTreeObserver viewTreeObserver = out_layout.getViewTreeObserver();
/**注冊(cè)1個(gè)回調(diào)函數(shù),當(dāng)1個(gè)視圖樹將要繪制時(shí)調(diào)用這個(gè)回調(diào)函數(shù)。
*參數(shù) listener 將要被添加的回調(diào)函數(shù)
*異常 IllegalStateException 如果isAlive() 返回false
*/
viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (!hasMeasured) {
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout
.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, img_bar.getHeight() + tv_title.getHeight(), 0, 0);
img_author.setLayoutParams(layoutParams);
hasMeasured = true;
}
return true;
}
});