Android UI源码解析

首先咱们从activity中的oncreate中的setContentView()方法介绍:
函数

在Window 抽象类中有三个setContentView的方法,Window类有是Activity的成员属性
spa

PhoneWindow继承了Window 实现了setContentView方法, 在PhoneWindow类中还有内部类DecorViewcode

DecorView继承了Framelayout 是一个具体现实View容器。xml

在PhoneWindow中实现setContentView具体方法:
对象

(layoutResID) {
    (== ) {
        installDecor()} (!hasFeature()) {
        .removeAllViews()}

    (hasFeature()) {
        Scene newScene = Scene.(layoutResIDgetContext())transitionTo(newScene)} {
        .inflate(layoutResID)}
    Callback cb = getCallback()(cb != && !isDestroyed()) {
        cb.onContentChanged()}
}

首先判断了mContentparent 是否为空,这个就是xml文件的根节点
继承


mLayoutInflater.inflate(layoutResID, mContentParent);将咱们的资源文件经过LayoutInflater对象转换为View树,而且添加至mContentParent视图中(其中mLayoutInflater是在PhoneWindow的构造函数中获得实例对象的LayoutInflater.from(context);)。资源

再来看下PhoneWindow类的setContentView(View view)方法和setContentView(View view, ViewGroup.LayoutParams params)方法源码:rem

(View viewViewGroup.LayoutParams params) {
    (== ) {
        installDecor()} (!hasFeature()) {
        .removeAllViews()}

    (hasFeature()) {
        view.setLayoutParams(params)Scene newScene = Scene(view)transitionTo(newScene)} {
        .addView(viewparams)}
    Callback cb = getCallback()(cb != && !isDestroyed()) {
        cb.onContentChanged()}
}

直接分析setContentView(View view, ViewGroup.LayoutParams params)方法就行,能够看见该方法与setContentView(int layoutResID)相似,只是少了LayoutInflater将xml文件解析装换为View而已,这里直接使用View的addView方法追加道了当前mContentParent而已。
get

因此说在咱们的应用程序里能够屡次调用setContentView()来显示界面,由于会removeAllViews源码


咱们先看一下源码中LayoutInflater实例化获取的方法

LayoutInflater (Context context) {
    LayoutInflater LayoutInflater =
            (LayoutInflater) context.getSystemService(Context.)(LayoutInflater == ) {
        AssertionError()}
    LayoutInflater}
  • 获取LayoutInflater实例的三种方式:

  • // 方式1

  • // 调用Activity的getLayoutInflater()

  • LayoutInflater inflater = getLayoutInflater();

  • // 方式2

  • LayoutInflater inflater = LayoutInflater.from(context);

  • // 方式3

  • LayoutInflater inflater = LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

相关文章
相关标签/搜索