先來(lái)一段onWindowFocusChanged的源碼介紹
public void onWindowFocusChanged(boolean ?hasFocus) {
}
問(wèn)題?
1.PopWindow無(wú)法在OnCreate贺纲、onStart量承、onResume中展示?
2.無(wú)法在OnCreate削饵、onStart、onResume中獲取View寬度和高度
分析:
Activity生命周期中,onStart, onResume, onCreate都不是真正visible的時(shí)間點(diǎn)肌厨,真正的visible時(shí)間點(diǎn)是onWindowFocusChanged()函數(shù)被執(zhí)行時(shí)。
譯注:從onWindowFocusChanged被執(zhí)行起,用戶(hù)可以與應(yīng)用進(jìn)行交互了杯瞻,而這之前,對(duì)用戶(hù)的操作需要做一點(diǎn)限制炫掐。
這個(gè)onWindowFocusChanged指的是這個(gè)Activity得到或者失去焦點(diǎn)的時(shí)候 就會(huì)call魁莉。。
也就是說(shuō) 如果你想要做一個(gè)Activity一加載完畢募胃,就觸發(fā)什么的話(huà) 完全可以用這個(gè)F煅洹!痹束!
使用一個(gè)view的getWidth() getHeight() 方法來(lái)獲取該view的寬和高检疫,返回的值卻為0。
如果這個(gè)view的長(zhǎng)寬很確定不為0的話(huà)祷嘶,那很可能是你過(guò)早的調(diào)用這些方法屎媳,也就是說(shuō)在這個(gè)view被加入到rootview之前你就調(diào)用了這些方法,返回的值自然為0.
解決該問(wèn)題的方法有很多抹蚀,主要就是延后調(diào)用這些方法剿牺。可以試著在onWindowFocusChanged()里面調(diào)用這些方法,驗(yàn)證時(shí)可以獲取到View的寬高的环壤。
相關(guān)執(zhí)行打印:
1: entry: onStart---->onResume---->onAttachedToWindow----------->onWindowVisibilityChanged--visibility=0---------->onWindowFocusChanged(true)------->
2. exit:? onPause---->onStop---->onWindowFocusChanged(false)? ---------------------- (lockscreen)
3. exit : onPause----->onWindowFocusChanged(false)-------->onWindowVisibilityChanged--visibility=8------------>onStop(to another activity)