![Android Studio开发实战:从零基础到App上线(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/515/26793515/b_26793515.jpg)
3.1 其他布局
本节介绍Android另外两个常用的布局视图,分别是相对布局RelativeLayout的属性说明与注意点、框架布局FrameLayout的属性说明与注意点。
3.1.1 相对布局RelativeLayout
RelativeLayout下级视图的位置是相对位置,得有具体的参照物才能确定最终位置。如果不设定下级视图的参照物,那么下级视图默认显示在RelativeLayout内部的左上角。用于确定视图位置的参照物分两种,一种是与该视图自身平级的视图,另一种是该视图的上级视图(RelativeLayout)。与参照物对比,相对位置的属性与类型值见表3-1。
表3-1 相对位置的属性与类型的取值说明
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-T77_106708.jpg?sign=1739628798-FlWqu09hbREqF2QD9GLEsQ0SLdWoAQGV-0-f2cae12f04c34502db7c2de171999c4b)
为了更好地理解上述相对属性的含义,接下来使用RelativeLayout及其下级视图进行布局,看看实际效果图是怎样的。下面是演示相对布局的XML代码:
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P78_106707.jpg?sign=1739628798-PFjHWMq5q7HMcU9dEghlt01BXhBfac4o-0-413ef67ce7c710a9b268e77049a799cb)
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P79_106705.jpg?sign=1739628798-Z4p8JlajFDqUpatgfVVPRs1qrSgJhDMN-0-d19514f2d8812313b69a8e0736bd538f)
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P80_7153.jpg?sign=1739628798-zjl38DQOg7rp8QjSXvBTCXIXE7iVsSBd-0-548afd707fe524499da47bc28479b024)
图3-1 在布局文件中定义的相对布局
上述布局文件的效果如图3-1所示,RelativeLayout的下级视图为各个按钮控件,按钮上的文字说明了所处的相对位置,具体的控件显示方位正如XML属性中描述的那样。
一般开发者在布局文件中就定义好了视图的相对位置,很少会等到在代码中定义。不过也有特殊情况,如果视图是在代码中动态添加的,那么相对位置也只能在代码中临时定义。代码中定义相对位置用到的是RelativeLayout.LayoutParams的addRule方法,该方法的第一个参数表示相对位置的类型,具体取值说明见表3-1;第二个参数表示参照物视图的ID,即当前视图要参照哪个视图确定自身位置。
下面是在代码中给RelativeLayout动态添加子视图并指定子视图相对位置的代码片段:
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P80_106704.jpg?sign=1739628798-e9jaqbbSzTq4LeEvcuaMX9EbotDcpqL4-0-dcb381d017444c914cbadaa386ffe45c)
动态添加子控件的效果如图3-2所示,在图上给每个方块子视图做了编号,以此区分该方块是由哪个按钮添加的以及添加的相对位置。
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P81_7177.jpg?sign=1739628798-ygwnLVDqOG5IEksusBpJLdBfDYrXW5Ft-0-74840fffc129a06c82d4b1158d661069)
图3-2 在代码中动态添加下级视图的相对布局
3.1.2 框架布局FrameLayout
FrameLayout也是较常用的布局,其下级视图无法指定所处的位置,只能统统从上级FrameLayout的左上角开始添加,并且后面添加的子视图会把之前的子视图覆盖掉。框架布局一般用于需要重叠显示的场合,比如绘图、游戏界面等,常见属性说明如下。
- foreground:指定框架布局的前景图像。该图像在框架内部永远处于最顶层,不会被框架内的其他视图覆盖。
- foregroundGravity:指定前景图像的对齐方式。该属性的取值说明同gravity。
为了更直观地理解FrameLayout,可在代码中为框架布局动态添加子视图,然后观察前后两个子视图的显示效果。
先给框架布局添加一个暗灰色的子视图,如图3-3所示。再给框架布局添加一个鲜红色子视图,如图3-4所示。此时后面添加的视图会覆盖前面添加的视图。注意,框架视图上方正中间的小图标一直都没被覆盖,是它被指定为前景图像的缘故。
除了线性布局、相对布局、框架布局外,Android还提供了其他几个布局视图,如绝对布局AbsoluteLayout、表格布局TableLayout等,不过这几个布局在实际开发中用得并不多,读者只需掌握前3种布局就可以了。
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P82_7189.jpg?sign=1739628798-N5kbkpvXKoOILMwol98VyWby3onyHBZC-0-bed241ff6dd0beee32c73266f9f7be50)
图3-3 在框架布局中添加第一个子视图
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P82_7190.jpg?sign=1739628798-2N1G8xAJF8Og9Cw8ZgYLajauCJum2703-0-b4ceef1fe7153e51fabca48f453b09f0)
图3-4 在框架布局中添加第二个子视图