AppCompatActivity- setContentView源码分析

1. AppCompatActivity的 setContentView源码分析


    // AppCompatActivity 中的 setContentView 方法
    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        getDelegate().setContentView(layoutResID);
    }

    @NonNull
    public AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            // 点击 AppCompatDelegate的 create方法,最终调用下边的方法
            mDelegate = AppCompatDelegate.create(this, this);
        }
        return mDelegate;
    }  

    // 这里会针对 23、14、11版本分别判断,最终会调用 
    // AppCompatDelegateImplV9 或者 AppCompatDelegateImplV7,
    // 也就是说最终其实调用 V9或者V7中的 setContentView方法
    private static AppCompatDelegate create(Context context, Window window,
            AppCompatCallback callback) {
        final int sdk = Build.VERSION.SDK_INT;
        if (BuildCompat.isAtLeastN()) {
            return new AppCompatDelegateImplN(context, window, callback);
        } else if (sdk >= 23) {
            return new AppCompatDelegateImplV23(context, window, callback);
        } else if (sdk >= 14) {
            return new AppCompatDelegateImplV14(context, window, callback);
        } else if (sdk >= 11) {
            return new AppCompatDelegateImplV11(context, window, callback);
        } else {
            return new AppCompatDelegateImplV9(context, window, callback);
        }
    }

    // 这个是 V9中的 setContentView,和 Activity中逻辑一样
    @Override
    public void setContentView(View v) {
        ensureSubDecor();
        // 根据 android.R.id.content 获取 contentParent
        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
        contentParent.removeAllViews();
        // 把我们自己的 setContentView 布局加载到 contentParent中
        contentParent.addView(v);
        mOriginalWindowCallback.onContentChanged();
    }

你可能感兴趣的:(AppCompatActivity- setContentView源码分析)