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の実装とします
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);