例如当我们编写代码时
View view = inflater.inflate(R.layout.main_activity, null);
安卓系统是做什么的?
例如当我们编写代码时
View view = inflater.inflate(R.layout.main_activity, null);
安卓系统是做什么的?
查看源代码LayoutInflater
。它是一个抽象类,其具体实例是通过getLayoutInflater()
.
本质上,inflater 创建一个根视图对象(被膨胀的 XML 的根视图组),然后通过 XML 树进行两次传递以附加每个子视图。这是递归完成的,以处理“包含”并修复子视图之间的引用,例如 in RelativeLayout
,并且从上到下完成。
第一遍通过实例化每个子视图来构造树,自上而下递归,并将 XML 属性传递给视图构造函数,告诉视图它应该有多大。然后,它measure()
使用度量规范对象调用由父级确定的限制(例如,具有 2 个子视图的相对布局,每个子视图都请求 match_parent)并询问视图它想要多大的限制。如果视图本身是一个视图组,它将使用相同的算法来测量它的子视图。
第二个传递是布局传递,当layout()
每个子级调用以将其自身定位在视图中时。父级使用在测量过程中计算的测量值定位视图。 onDraw()
被调用并传递一个从DecorView
支持位图创建的画布。
完成的树然后准备传递给由setContentView()
或完成的窗口管理器addContentView()
。
用简单的语言扩展 XML 布局意味着您正在转换XML
in View
. 然后,您可以使用父视图/膨胀视图获取在 XML 中声明的每个视图。
例如 -
View view = inflater.inflate(R.layout.main_activity, null);
现在,这里view
是 XML 的引用,您可以从中获取所有视图:
TextView tv = (TextView)view.findViewById(R.id.tv);