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();
}
网友评论