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;這行報了空指針異常,是以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
作者:我愛物聯網
出處:http://yydcdut.cnblogs.com/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。