ActivityのsetContentView()メソッドソース分析
3141 ワード
一、ActivityのsetContentView()には3つの実装がある:1.public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); } 2. public void setContentView(View view) { getWindow().setContentView(view); initWindowDecorActionBar(); } 3.public void setContentView(View view, ViewGroup.LayoutParams params) { getWindow().setContentView(view, params); initWindowDecorActionBar(); } getWindow()はPhoneWindowを返し、PhoneWindowのsetContentViewの実装2、PhoneWindowのsetContentViewのまとめを見ると2つのパラメータを受け入れる実装があります.1つはパラメータレイアウトファイルで、1つはパラメータviewで、まずパラメータをviewの実装とします
まずinstallDecor()メソッド:private void installDecor(){if(mDecor==null){mDecor=generateDecor();//////mDecor=new DecorView(getContext(),−1)mDecor.setDescenantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);//mDecorのプロパティmGroupFlags mDecor.setIsRootNamespace(true);//////////////////////////////////////////////////////////////////////////////////////////////////////////mPrivateFlagsif(!mInvalidatePanelMenuPosted&&mInvalidatePanelMenuFeatures!=0){ mDecor.postOnAnimation(mInvalidatePanelMenuRunnable); } } if(mContentParent==null){mContentParent=generateLayout(mDecor);//mDecorを入力し、mDecorにシステムレイアウト生成からのViewを入力し、システムレイアウト内のコンテンツコンテナコントロールを見つけてmContentParentに割り当て、mContentRootはシステムレイアウトファイル生成のViewmDecor.makeOptionalFitsystemWindows();...}mContentParentがnullに等しい場合、installDecor()を実行すると、mDecorとmContentParentが生成されます.そうしないと、mContentParentが空になり、最後にviewがmContentParentに追加されます.
PhoneWindowのsetContentViewパラメータは、Viewの実行フローです.先生がDecorViewになり、DecorViewにシステムのレイアウトファイルで生成されたViewを追加し、このViewからコンテンツコンテナコントロールを見つけてmContentParentに割り当て、最後に受信したパラメータviewをmContentParentに追加します.
三、PhoneWindowのsetContentViewパラメータはレイアウトファイルの実現である
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
view.setLayoutParams(params);
final Scene newScene = new Scene(mContentParent, view);
transitionTo(newScene);
} else {
mContentParent.addView(view, params);
}
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
まずinstallDecor()メソッド:private void installDecor(){if(mDecor==null){mDecor=generateDecor();//////mDecor=new DecorView(getContext(),−1)mDecor.setDescenantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);//mDecorのプロパティmGroupFlags mDecor.setIsRootNamespace(true);//////////////////////////////////////////////////////////////////////////////////////////////////////////mPrivateFlagsif(!mInvalidatePanelMenuPosted&&mInvalidatePanelMenuFeatures!=0){ mDecor.postOnAnimation(mInvalidatePanelMenuRunnable); } } if(mContentParent==null){mContentParent=generateLayout(mDecor);//mDecorを入力し、mDecorにシステムレイアウト生成からのViewを入力し、システムレイアウト内のコンテンツコンテナコントロールを見つけてmContentParentに割り当て、mContentRootはシステムレイアウトファイル生成のViewmDecor.makeOptionalFitsystemWindows();...}mContentParentがnullに等しい場合、installDecor()を実行すると、mDecorとmContentParentが生成されます.そうしないと、mContentParentが空になり、最後にviewがmContentParentに追加されます.
PhoneWindowのsetContentViewパラメータは、Viewの実行フローです.先生がDecorViewになり、DecorViewにシステムのレイアウトファイルで生成されたViewを追加し、このViewからコンテンツコンテナコントロールを見つけてmContentParentに割り当て、最後に受信したパラメータviewをmContentParentに追加します.
三、PhoneWindowのsetContentViewパラメータはレイアウトファイルの実現である
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
getContext());
transitionTo(newScene);
} else {
mLayoutInflater.inflate(layoutResID, mContentParent);
}
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
mLayoutInflater.inflate(layoutResID, mContentParent);