4.1 View和ViewGroup

Activity是Android应用程序与用户交互的接口,每一个屏幕视图都对应一个Activity。其实Activity本身无法显示在屏幕上,其更像一个用于装载可显示组件的容器。这就好比一个JSP页面,它本身并没有显示出来任何东西,负责显示的是JSP页面内的各种HTML标签,而JSP页面好比一个容器,负责将这些表情装载到页面内。那么在Android应用程序里谁才是真正负责显示的那部分呢?答案是View和ViewGroup,其中ViewGroup是View的子类。

Android UI界面是通过View(视图)和ViewGroup及其派生类组合而成的。其中View是所有UI组件的基类,基本上所有的高级UI组件都是继承View类实现,如TextView(文本框)、Button、List、EditText(编辑框)、Checkbox等。一个View在屏幕占据一块矩形区域,他负责渲染这块矩形区域,也可以处理这块矩形区域发生的事件,并可以设置该区域是否可见以及获取焦点等;而ViewGroup是容纳这些组件的容器,其本身也是从View中派生出来的,它继承于Android.view.View,它的功能就是装载和管理下一层的View对象或ViewGroup对象,也就是说它是一个容纳其他元素的容器,负责对添加进来的View和ViewGroup进行管理和布局。View和ViewGroup的关系如图4.1所示。

图4.1 View和ViewGroup的关系图

从上图可以看到,ViewGroup可以包含一个或任意几个View(视图),也可以包含作为更低层次的子ViewGroup,而子ViewGroup又可以包含下一层的叶子节点的View和ViewGroup。这种灵活的层次关系可以形成复杂的UI布局。在开发过程中形成的用户界面UI一般是来自于View和ViewGroup类的直接子类或者间接子类。

例如,View派生出的直接子类有:AnalogClock, ImageView, KeyboardView, ProgressBar, Space, SurfaceView, TextView, TextureView, ViewGroup, ViewStub等。ViewGroup派生出的直接子类有:AbsoluteLayout, FragmentBreadCrumbs, FrameLayout, GridLayout, LinearLayout, RelativeLayout, SlidingDrawer等。本章不能对View和ViewGroup的所有子类都进行详细的介绍,只能简单介绍其中常用的一小部分。如果需要了解各UI组件的相关信息,请参考相关文档。