美文网首页
从setContentView分析layoutInflater

从setContentView分析layoutInflater

作者: Johnson_Coding | 来源:发表于2021-01-21 15:53 被阅读0次

    关于setContentView:

    //把一个布局资源设置到Activity内容,这个资源将会被加载解析,添加到Activity所有顶层的的视图上。
        public void setContentView(@LayoutRes int layoutResID) {
            getWindow().setContentView(layoutResID);
            initWindowDecorActionBar();
        }
    
           //找到android.view.PhoneWindow类的setContentView()
        @Override
        public void setContentView(int layoutResID) {
            // Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window
            // decor, when theme attributes and the like are crystalized. Do not check the feature
            // before this happens.
            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();
            }
            mContentParentExplicitlySet = true;
        }
    
    // 这是窗口的顶层视图,包含窗口装饰。这里说明DecorView是窗口的顶层视图。
    private DecorView mDecor;
    if (mDecor == null) {
                mDecor = generateDecor(-1);
                mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
                mDecor.setIsRootNamespace(true);
                if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {
                    mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
                }
            } else {
                mDecor.setWindow(this);
            }
    
    mLayoutInflater.inflate(layoutResID,mContentParent);逻辑代码,就是将资源文件xml进行解析然后加载到视图容器上
    public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
           return inflate(resource, root, root != null);
    }
    
    public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
            final Resources res = getContext().getResources();
            if (DEBUG) {
                Log.d(TAG, "INFLATING from resource: \"" + res.getResourceName(resource) + "\" ("
                        + Integer.toHexString(resource) + ")");
            }
    
            final XmlResourceParser parser = res.getLayout(resource);
            try {
                return inflate(parser, root, attachToRoot);
            } finally {
                parser.close();
            }
        }
    

    [参考](14条消息) 三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别_weixin_30687051的博客-CSDN博客

    相关文章

      网友评论

          本文标题:从setContentView分析layoutInflater

          本文链接:https://www.haomeiwen.com/subject/gtqdzktx.html