查看源代码的网站http://androidxref.com
1.activity中的setContent(id)的源码
这里的getWindow()其实就是PhoneWindow对象,直接在studio中并不能查看,需要借助上面的网站
2.在PhoneWindow类中,重要的还是调用了installDecor()方法和LayoutInflater中的inflate方法,其中installDecor()方法中对跟布局进行初始化,这样在使用LayoutInflater方法的时候就将创建好的新布局添加到这个mContentParent布局上。
3.主要是对跟布局的初始化
4.在generateLayout()方法中
重要的就是创建了contentParent并且返回。
5.LayoutInflater.from(this).inflate(int resource, ViewGroup root, boolean attachToRoot)
如果是merge标签,那么就直接调用rInflate()方法(后面会有分析),如果不是,那么就开始创建根布局也就是temp
在createViewFromTag()中创建一个view,其实就是创建根布局。如果root不为空,那么就调用root.addView(temp,params)这样将新的根布局添加到root中。
然后调用rInflateChildren()中进行寻找下一级的view
如果root等于null,那么就
6.这个是通过name创建相应的view。
重要的就是判断name中是否有.字符。如果没有,则证明是系统控件,否则就是自定义的控件。系统控件需要补全类名,然后创建相应的对象。
补全相应的全类名
补全后都会调用createView()方法,然后通过获取相应的构造器,然后创建其对象然后返回。这里为了提升性能,做了构造器的缓存处理、
通过构造器创建其相应的对象。
7.调用rInflate()方法
这里其使用了深度优先遍历。先通过createViewFromTag()方法获取到根布局。然后调用rInflateChildren()方法进行迭代处理,再找到相应的跟布局。最后不断的将view添加到上一级的view中。
android源码--setContentView()和LayoutInflater.inflate()源码分析
最新推荐文章于 2020-08-21 16:39:54 发布