標籤:android style blog ar color sp strong 檔案 on
Android中擷取手機螢幕的高度和寬度,我們知道在onCreate方法中擷取到的值都是為0的,有人說可以在onClick方法中擷取值,這個也是個方法 ,但在onWindowFocusChanged方法中可以直接擷取到,而且有的時候情境的需要,就不得不在Activity渲染完成後立馬擷取值,這時候onWindowFocusChanged()方法就用到實處了,類似的有PopupWindow的顯示,如果在onCreate方法中執行的話,會報沒有token的異常,就是因為Activity沒有渲染成功.
onWindowFocusChanged():當Activity的當前Window獲得或失去焦點時會被回調此方法。當回調了這個方法時表示Activity是完全對使用者可見的(只是可見,還一片黑呼呼的,有待draw..)。當對話方塊彈起/消失及Activity新建立及回退等都會調用此方法。
相比之下,onResume()方法更多的是指Activity進入了可見的狀態,但只是狀態,並不是真正的介面構建完成了。
demo
一個Activity只顯示一個TestImageView,並重寫TestImageView下的onMeasure()、onLayout()、onDraw()方法,並對其設定onGlobalLayout()監聽,觀察這幾個方法與Activity的onResume()、onWindowFocusChanged()的調用順序,如下:
ClipDrawableActivity onCreate() time=1376920332125 ClipDrawableActivity onResume() TestImageView.width=0 time=1376920332149 MainActivity onWindowFocusChanged hasFocus=false ClipDrawableActivity TestImageView onMeasure() ClipDrawableActivity TestImageView onMeasure() ClipDrawableActivity TestImageView onMeasure() ClipDrawableActivity TestImageView onMeasure() ClipDrawableActivity TestImageView onLayout() ClipDrawableActivity onGlobalLayout() TestImageView.width=736 time=1376920332185 ClipDrawableActivity onWindowFocusChanged() hasFocus=true TestImageView.width=736 time=1376920332187 ClipDrawableActivity TestImageView onMeasure() ClipDrawableActivity TestImageView onMeasure() ClipDrawableActivity TestImageView onLayout() ClipDrawableActivity onGlobalLayout() TestImageView.width=736 time=1376920332194 ClipDrawableActivity TestImageView onDraw()
Activity.oncreate()→Activity.onResume()→TestImageView.onMeasure()→TestImageView.onLayout()→onGlobalLayoutListener()→Activity.onWidnowFocusChanged()→.....→TextImageView.onDraw()
總結
至此,如果需要擷取某個View的寬高,可以在onWindowFocusChanged()處直接擷取即可,這比對某個view設定onGlobalLayoutListener的方式來擷取方便了許此。又比如,對於需要讀取本地檔案記錄來判斷是否是第一次開啟介面去提示文本圖片的,也可以在此方法中去讀取然後再顯示在ui上。
我是天王蓋地虎的分割線
Android -- onWindowFocusChanged