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