在开发Android应用界面的时候,我们首先会创建一个布局文件,如layout.xml,然后在代码当中使用setContentView()方法将刚才创建layout布局文件导入到Activity中,这样,在运行程序的时候我们就会在模拟器或手机上看到这个布局,其实,在Android中,我们创建的这个布局并不是直接加载到AndroidUI的,而是在之前历经了几个过程,具体过程如下:
PhoneWindow
DecorView
System Layout
Content Parent
Activity Layout
1.PhoneWindow
Android中的基本的窗口系统,每个Activity 均会创建一个PhoneWindow对象,是Activity和整个View系统交互的接口。
2.DecorView
DecorView是当前Activity所有View的父类,它并不会向用户呈现任何东西,主要功能如下:
接收ViewRoot分发来的事件,如key、touch、trackball等;
作为PhoneWindow与ViewRoot之间的桥梁,ViewRoot通过DecorView设置窗口属性;
DecorView有一个直接的子View,我们称之为System Layout,这个View是从系统的Layout.xml中解析出的,它包含当前UI的风格,如是否带title、是否带process bar等。
3.SystemLayout
PhoneWindow通过解析预置的layout.xml来获得不同的layout,我们称之为System Layout,我们将这个System Layout添加到DecorView中,Android提供了8种System Layout;
预设风格可以通过PhoneWindow方法requestWindowFeature()来设置,需要注意的是这个方法需要在setContentView()方法调用之前调用。
4.ContentParent
Content Parent的子类是ContentView,它其实对应的是System Layout中的id为"content"的一个FrameLayout。这个FrameLayout对象包括的才是我们的Activity layout(每个System Layout都会有这么一个id为"content"的一个FrameLayout)。
5.Activity Layout
设置窗口的ContentView,用来和userUI进行交互,其上的几层并不能响应并完成user输入所期望达到的目的。
下面举个例子来验证以上所述内容:
首先,我们需要新建一个工程,然后使用模拟器运行。
然后,我们打开SDK文件下的hierarchyviewer工具,查看当前界面的图层结构,如下图:
根据上面的分析,我们不难看出,当我们加载一个程序的界面时,首先执行的是PhoneWindow,接着是DecorView,后面的LinearLayout即为SystemLayout,它包含了一个标题,标题的布局为上面的FrameLayout和TextView,下面的FrameLayout为ContentView,注意它的id为content,用于加载开发者定义的界面,后面的RelativeLayout和TextView就是我们定义的布局文件。