安卓开发setContentView
在开发安卓的时候,必不可少的就是四大组件之一的Activity,其中重写onCreate函数是我们开发的第一步,首先调用父类的onCreate函数进行相应的初始化,接着调用setContentView函数来加载我们的布局XML文件。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
就像上面的代码,那么setContentView的内部到底进行了什么
我们编写的Activity继承于AppCompatActivity
public class MainActivity extends AppCompatActivity
所以看看AppCompatActivity中是如何实现的
public void setContentView(@LayoutRes int layoutResID) {
getDelegate().setContentView(layoutResID);
}
AppCompatActivity中是交给AppCompatDelegate这个接口来实现这个功能,所以我就在v7包找到了实现这接口的实现类,我只关注setContentView的实现:
@Override
public void setContentView(View v) {
ensureSubDecor();
ViewGroup contentParent = (ViewGroup);
mSubDecor.findViewById(android.R.id.content);
contentParent.removeAllViews();
contentParent.addView(v);
mOriginalWindowCallback.onContentChanged();
}
@Override
public void setContentView(int resId) {
ensureSubDecor();
ViewGroup contentParent = (ViewGroup)
mSubDecor.findViewById(android.R.id.content);
contentParent.removeAllViews();
LayoutInflater.from(mContext).inflate(resId, contentParent);
mOriginalWindowCallback.onContentChanged();
}
@Override
public void setContentView(View v, ViewGroup.LayoutParams lp) {
ensureSubDecor();
ViewGroup contentParent = (ViewGroup);
mSubDecor.findViewById(android.R.id.content);
contentParent.removeAllViews();
contentParent.addView(v, lp);
mOriginalWindowCallback.onContentChanged();
}
重载了好几个方法,那就看第二个,首先获取View的父容器,然后清理掉,最终使用的LayoutInflate(一个布局解析器),来解析然后加载,最后使用窗口回调通知内容已经改变。
和预想的差不多,最终是使用LayoutInflate解析布局,然后回调。