這真是一個(gè)頭疼的問題,有時(shí)候獲得的寬高就是0.
接下來(lái)我們來(lái)試試這幾個(gè)方法。
1.onWindowFocusChanged
onWindowFocusChanged: View已經(jīng)初始化完畢了,寬高已經(jīng)準(zhǔn)備好了。這個(gè)時(shí)候去獲取寬高是沒有問題的。需要注意的是,onWindowFocusChange會(huì)被調(diào)用多次。 當(dāng)Activity的窗口得到焦點(diǎn)和失去焦點(diǎn)時(shí)均會(huì)被調(diào)用一次,具體來(lái)說(shuō),當(dāng)Activity繼續(xù)執(zhí)行和暫停執(zhí)行時(shí)。onWindowFocusChanged均會(huì)被調(diào)用,如果頻繁地進(jìn)行onResume和onPause,那么onWindowFocusChanged,也會(huì)被頻繁的調(diào)用。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
// view.getMeasuredHeight();寫獲取寬高的方法
}
}
2.view.post(runnable)
通過post可以將一個(gè)runnable投遞到消息對(duì)列的尾部,然后等待looper調(diào)用runnable的時(shí)候View已經(jīng)初始化了。(艸,筆者寫的這個(gè)東西我竟然一知半解)
@Override
protected void onStart() {
super.onStart();
view.post(new Runnable() {
@Override
public void run() {
// view.getMeasuredHeight();寫獲取寬高的方法
}
});
}
3.ViewTreeObserver
使用ViewTreeObserver的眾多回調(diào)可以完成這個(gè)功能,比如使用OnGlobaLayoutListener這個(gè)接口。
當(dāng)View樹的狀態(tài)發(fā)生改變或者View樹內(nèi)部的View的可見性發(fā)生變化時(shí)。onGlobalLayout方法將會(huì)被回調(diào),因此這是獲取View的寬高一個(gè)很好的時(shí)機(jī)。但是伴隨著View樹的狀態(tài)的改變,onGlobalLayout會(huì)被調(diào)用多次。
@Override
protected void onStart() {
super.onStart();
ViewTreeObserver observer = searchViewLayout.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
searchViewLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int width = searchViewLayout.getMeasuredWidth();
}
});
}
對(duì)于這個(gè)onGlobalLayout方法我是印象深刻,我記得我在那家公司寫代碼時(shí),把一個(gè)服務(wù)器請(qǐng)求寫在了這里面。由于那家公司沒有什么測(cè)試,代碼檢查方面的流程。基本上開發(fā)寫好代碼自己測(cè)試一下就上線。一上線就遭到不少客戶投訴。
“什么鬼,勞資打開你們的應(yīng)用,一個(gè)小時(shí)吃掉我五十多兆流量?”
“what the hell?”
4.view.measure();
具體代碼長(zhǎng)這樣:
@Override
protected void onStart() {
super.onStart();
int widthSpce = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
int heightSpce = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
searchViewLayout.measure(widthSpce,heightSpce);
int width = searchViewLayout.getMeasuredWidth();
}
由于比較復(fù)雜,就不多描述。自己去探索吧。
注意:以上方法都沒有經(jīng)過測(cè)試,使用的時(shí)候小心有坑。###
來(lái)自Android開發(fā)藝術(shù)探索(真是一本好書!)