安卓开发setContentView

安卓开发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解析布局,然后回调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值