View和ViewGroup中的mParent
源码版本为 Android 10(Api 29),不同Android版本可能有一些差别
mParent
从名字看,应该表示父View,而这篇博客我们就是要探索View
和ViewGroup
中的mParent
分别表示什么,以及在什么地方赋值的。
页面顶层View(DecorView)中 mParent 表示的什么?
通过《Activity 的组成》 我们知道了界面的顶层View
是DecorView
,那么我们查看mParent
的来源,首先就应该查看 DecorView
的mParent
是什么,在哪里被赋值的。
通过《Activity常见问题》的 【Activity 在 onResume 之后才显示的原因是什么?】 部分能知道DecorView
是怎样添加到PhoneWindow
的(ActivityThread#handleResumeActivity()
-> WindowManagerImpl#addView()
-> WindowManagerGlobal#addView()
-> ViewRootImpl#setView()
)。在 ViewRootImpl#setView()
方法中通过调用 Session#addToDisplay()
方法开始实现客户端与WMS之间的绑定,不过这里不是我们今天关注的重点。我们今天关注的重点在这个方法的另一行那个代码。在来看一下ViewRootImpl#setView()
方法:
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
synchronized (this) {
if (mView == null) {
mView = view;
// 调用 requestLayout() 方法,进行布局(包括measue、layout、draw)
requestLayout();
mOrigWindow