Android控件架构
我们经常编写Layout文件,通过Layout文件我们可以看到所有的View在界面上均占有一矩形区域,而我们可以把这种矩形区域(View)大致分为两类,即包含有小矩形区域的大矩形区域(ViewGroup)和单一的矩形区域(View),这种大小矩形相套的格局,自顶向下形成一种树形结构,我们可以将其称为View树.
下图是我绘制的一幅简略的View树,以便大家更好地理解这种层次:
ViewGroup是Layout和View Container的基类,ViewGroup.LayoutParams为ViewGroup提供布局参数,其内可包含多个View,并管理其所包含的View.在整个View树中,上层控件负责下层控件的测量和绘制,并传递交互事件.我们经常在Activity看到如下的代码:
Button btn = (Button)findViewById(R.id.btn);
通常情况下,就是在View树中按照深度优先遍历算法查找到该View.
上面我们介绍了View树,接下来我们对照View树引入Android界面架构,在Android中,每一个Activity都包含一个Window对象,在Android中Window对象通常由PhoneWindow实现,PhoneWindow将一个DecorView设置成整个应用窗口的根View.在显示上,DecorView将整个屏幕分为两部分,TitleView和ContentView,看到ContentView,大家应该懂了吧,我们通常setContentView(R.layout.activity_main)
就是设置在这里的,通过上述描述,我们就可以建立一个标准的视图树,如下所示:
这里就可以解答我们的一个疑惑,为什么通过requestWindowFeature(Window.FEATURE_NO_TITLE)
设置全屏必须在setContentView
之前调用了(注意这里只是粗略描述视图树的结构,不同的Android版本对UI的管理不同,大体是一样的).