標籤:
onAttachedToWindow在Activity生命週期中的位置
放大招:
onAttachedToWindow不能在onCreate中喲~
View view = getWindow().getDecorView(); WindowManager.LayoutParams lp = (WindowManager.LayoutParams)view.getLayoutParams(); lp.gravity = Gravity.CENTER; lp.width = (dm.widthPixels * 4) / 5; lp.height = (dm.widthPixels * 4) / 5; getWindowManager().updateViewLayout(view,lp);
放到onCreate中進行測試,結果在lp.gravity = Gravity.CENTER;這行報了null 指標異常,所以view.getLayoutParams()擷取的LayoutParams是空。
public final class ActivityThread { ...... final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) { ...... ActivityClientRecord r = performResumeActivity(token, clearHide); if (r != null) { final Activity a = r.activity; ...... // If the window hasn‘t yet been added to the window manager, // and this guy didn‘t finish itself or start another activity, // then go ahead and add the window. boolean willBeVisible = !a.mStartedActivity; if (!willBeVisible) { try { willBeVisible = ActivityManagerNative.getDefault().willActivityBeVisible( a.getActivityToken()); } catch (RemoteException e) { } } if (r.window == null && !a.mFinished && willBeVisible) { r.window = r.activity.getWindow(); View decor = r.window.getDecorView(); decor.setVisibility(View.INVISIBLE); ViewManager wm = a.getWindowManager(); WindowManager.LayoutParams l = r.window.getAttributes(); a.mDecor = decor; l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION; ...... if (a.mVisibleFromClient) { a.mWindowAdded = true; wm.addView(decor, l); } } ...... } ...... } ...... }
原來在ActivityThread執行handleResumeActivity時就會為PhoneWindow(r.activity.getWindow)中的DecorView設定LayoutParam,並且通過源碼發現handleResumeActivity函數首先會執行performResumeActivity,此時會調用Activity的onResume()生命週期函數,這時問題就比較清晰了,看來只要在Activity的onResume生命週期後就能擷取DecorView的LayoutParam,進而可以設定高度和寬度了。根據上面貼出的生命週期圖,onResume()後面是onAttachedToWindow(),並且onAttachedToWindow只會調用一次,不會受使用者操作行為影響。所以在onAttachedToWindow中進行視窗尺寸的修改再合適不過了。
乾貨
- onAttachedToWindow運行在onResume之後;
- DecorView的LayoutParams是在ActivityThread的handleResumeActivity中設定的,並且該函數會調用Activity的onResume生命週期,所以在onResume之後可以設定表單尺寸;
我是天王蓋地虎的分割線
參考:http://blog.csdn.net/guxiao1201/article/details/41517871
Android -- onAttachedToWindow()