当xml“膨胀”时,幕后会发生什么?

时间:2012-12-24 16:36:13

标签: android android-inflate

例如,当我们编写代码时

View view = inflater.inflate(R.layout.main_activity, null);

Android系统有什么作用?

2 个答案:

答案 0 :(得分:4)

查看LayoutInflater的来源。它是一个抽象类,其具体实例是通过getLayoutInflater()获得的。

实质上,inflater创建一个根视图对象(膨胀的XML的根视图组),然后通过XML树进行两次遍历以附加每个子视图。这是递归地处理“包含”并修复子视图之间的引用,例如在RelativeLayout中,并且从上到下完成。

第一遍通过实例化每个子视图来构造树,递归地自上而下,并将XML属性传递给视图构造函数,告诉视图它应该有多大。然后,它使用一个度量规范对象为每个传递父节点限制的子节点(例如,具有2个子视图的RelativeLayout,每个请求match_parent)调用measure(),并询问视图它想要多大。如果视图本身是一个视图组,它将使用相同的算法来测量它的子视图。

第二遍是在每个孩子调用layout()以在视图中定位自己时的布局过程。父级使用在度量过程中计算的度量来定位视图。调用onDraw()并传递从DecorView支持位图创建的Canvas。

然后,已完成的树可以传递给窗口管理器,该窗口管理器由setContentView()addContentView()完成。

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/view/LayoutInflater.java#LayoutInflater

答案 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);