界面编程与视图(View)组件
一、视图组件与容器组件
Android应用的绝大部分UI组件都放在android.widget包及其子包、android.view包及其子包中,Android应用的所有UI组件都继承了View类。
View类有重要的子类:ViewGroup,但ViewGroup通常作为其他组件的容器使用。
Android的所有UI组件都是建立在View、ViewGroup基础之上的,Android采用了“组合器”设计模式来设计View和ViewGroup:ViewGroup是View的子类,因此ViewGroup也可被当成View使用。对于一个Android应用的图形图形用户界面来说,ViewGroup作为容器来盛装其他组件,而ViewGroup里除了可以包含普通View组件之外,还可以再次包含ViewGroup组件。
图2.1显示了Android图形用户界面的组件层次图。
图2.1图形用户界面的组件层次图
Android推荐使用XML布局文件来定义用户界面,而不是使用Java代码来开发用户界面,因此所有组件都提供了两种方式来控制组件的行为:
- 在XML布局文件中通过XML属性进行控制。
- 在Java程序代码中通过调用方法进行控制。
ViewGroup继承了View类,当然也可以当成普通View来使用,但VewGroup主要还是当成容器类使用。但由于ViewGroup是一个抽象类,因此实际使用中通常总是使用ViewGroup的子类作为容器,例如各种布局管理器。
ViewGroup容器控制其子组件的分布依赖于ViewGroup.LayoutParams、ViewGroup.MarginLayoutParams两个内部类。这两个内部类都提供了一些XML属性,ViewGroup容器中的子组件可以指定这些XML属性。
图2.2显示了ViewGroup.LayoutParams所支持的两个XML属性
XML属性 | 说明 |
android:laout_height | 指定子组件的布局高度 |
android:layout_height | 指定该子组件的布局宽度 |
android:layout_height、android:layout_width两个属性,支持如下三个属性值。
- fill_parent:指定子组件的高度、宽度与父容器组件的高度、宽度相同(实际上还要减去填充的空白距离)
- match_parent:该属性值与fill_parent完全相同,且从Android 4.2开始就推荐使用这个属性来代替fill_parent。
- wrap_content:指定子组件的大小恰好能包裹它的内容即可。
图2.3显示了ViewGroup.MarginLayoutParams用于控制子组件周围的页边距(Margin,也就是组件四周的留白),它支持的XML属性如图2.3所示
XML属性 | 相关方法 | 说明 |
android:layout_marginBottom | setMargins(int,int,int,int) | 指定该子组件下边的页边距 |
android:layout_marginLeft | setMargins(int,int,int,int) | 指定该子组件左边的页边距 |
android:layout_marginRight | setMargins(int,int,int,int) | 指定该子组件右边的页边距 |
android:layout_marginTop | setNargins(int,int,int,int) | 指定该子组件上边的页边距 |
二、使用XML布局文件控制UI界面
Android推荐使用XMl布局文件来控制视图,这样不仅简单、明了,而且可以将应用的视图控制逻辑从Java代码中分离出来,放入XML文件中控制,从而更好的体现MVC原则。
当我们在Android应用的res/layout目录下定义一个主文件名任意的XML布局文件之后(R.java会自动收录该布局资源),Java代码可通过如下方法在Activity中显示该视图:
setContentView(R.layout.<资源文件名>)
当在布局文件中添加多个UI组件时,都可以为该UI组件指定android:id属性,该属性的属性值代表该组件的唯一标识。接下来如果希望在Java代码中访问指定UI组价,可通过如下代码来访问它:
findViewById(R.id.<android.id.属性值>)
一旦在程序中获得指定UI组件之后,接下来就可以通过代码来控制UI组件的外观行为啦,包括为UI组件绑定事件监听器等。