Android中的onWindowFocusChanged()方法詳解
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中View.measure方法詳解AndroidView
- android StartActivityForResult()方法詳解Android
- Java中的main()方法詳解JavaAI
- Java中的方法引用詳解Java
- 詳解Android中AsyncTask的使用Android
- Android中的ANR用法詳解Android
- Android中的Context詳解AndroidContext
- Android 中的 Checkbox 詳解Android
- Android 中的 HandlerThread 詳解Androidthread
- Android FragmentTabHost 使用方法詳解AndroidFragment
- Pandas中resample方法詳解
- Android中PopupWindow使用詳解Android
- Android中AsyncTask使用詳解Android
- Python 中的魔術方法詳解Python
- JavaScript 陣列中的 indexOf 方法詳解JavaScript陣列Index
- Python中的魔術方法詳解Python
- Java 8中的default方法使用詳解Java
- Android中Activity的LunchMode引數詳解Android
- Java中getGenericSuperclass()方法詳解Java
- Android中SQLite應用詳解AndroidSQLite
- Android中Context用法詳解AndroidContext
- Android 中 HttpURLConnection 使用詳解AndroidHTTP
- Android中HttpURLConnection使用詳解AndroidHTTP
- 詳解Android中的四大元件之一:Activity詳解Android元件
- Android開發中的MVP架構詳解AndroidMVP架構
- 詳解Python中的str.format方法PythonORM
- 詳解Java中的clone方法:原型模式Java原型模式
- (轉)onWindowFocusChanged觸發簡介
- Android 中 XML 資料解析詳解AndroidXML
- Android中App安裝位置詳解AndroidAPP
- JQuery中$.ajax()方法引數詳解jQuery
- list中add、set方法詳解
- php中Session使用方法詳解PHPSession
- Android逆向之旅---Android中的sharedUserId屬性詳解Android
- 詳解 Android 中的 IPC 機制:基礎篇Android
- Android中圖片的三層快取詳解Android快取
- 詳細解讀Python中的__init__()方法Python
- 詳解nginx伺服器中的安全配置的方法Nginx伺服器