Android开发笔记(三十五)页面布局视图

布局视图的类别

布局视图有五类,分别是线性布局LinearLayout、相对布局RelativeLayout、框架布局FrameLayout、绝对布局AbsoluteLayout、表格布局TableLayout。其中最常用的是LinearLayout,它适用于包括简单布局在内的多数情况;其次常用的是RelativeLayout,它适用于一些复杂布局,主要是对相对位置要求较多的情况;再次就是FrameLayout,它一般用于需要叠加展示的场合,比如说给整个页面设置一个背景布局等等。AbsoluteLayout和TableLayout实际中很少用,基本不用关心。


另外还有纵向滚动视图ScrollView,以及横向滚动视图HorizontalScrollView,其作用顾名思义便是让它们的子视图可以在某个方向上滚动罢了。



布局xml属性的定义

最基本的宽高如layout_width、layout_height取值类型有两类,分别是match_parent/fill_parent(这两个都表示与上级视图一致),以及wrap_content(这个表示按照内容大小自适应)。


下面是几个容易混淆的通用属性:
1、layout_gravity和gravity的区别 : layout_gravity指的是当前视图位于上级视图的哪个位置,而gravity指的是下级视图位于当前视图的哪个位置。
2、layout_margin和padding的区别 : layout_margin指的是当前视图与外部视图的距离,这个margin部分不属于当前视图;padding指的是当前视图与其内部视图的距离,这个padding部分属于当前视图。为了更直观地感觉,我们可以做个实验,给当前视图设置背景色,然后同时设置layout_margin和padding。结果会发现,margin部分没有背景色,而padding部分是有背景色的。
3、visibility各取值的区别 : 该属性有三个取值,分别是:visible表示可见,invisible表示不可见,gone表示消失。初学者有时分不清invisible和gone的区别,其实它们的区别很简单,invisible虽然看不到但还占着位置,看起来那里就是有块空白;gone不但看不到而且也不占位置了,看上去是不留痕迹的消失掉了。
4、layout_weight : 该属性表示当前视图宽或高的权重,但这个权重不是把上级视图的所有空间拿来分配,只是把上级视图的剩余空间拿来分配。所以如果layout_width或者layout_height设置为wrap_content,此时再设置layout_weight,往往发现每个视图的空间并非希望得到的,因为上级视图先扣掉子视图wrap_content后的长度,最后的剩余长度才拿来按照权重分配,所以当然不是我们想要的结果。正确的做法是,把layout_width或者layout_height设置为0dp,同时再指定各下级视图的layout_weight,这表示所有的下级视图都不占空间,那么上级视图的所有空间都剩下来了,此后把所有空间按照权重分配给每个下级视图,才能得到我们的期望结果。


然后是每种布局视图各自要另外指定的属性。具体如下:


LinearLayout需要指定的是orientation,具体取值大家都很熟悉了:vertical表示垂直布局;horizontal表示水平布局。不过该属性值默认是horizontal,可能出乎多数人的意料,因为大家感觉手机APP理应是从上往下垂直布局,所以这里要特别注意垂直布局一定要设置orientation,不然默认水平布局不符合多数业务场景。


RelativeLayout额外多出了下列的相对位置属性:
layout_toLeftOf : 在指定视图左边
layout_toRightOf : 在指定视图右边
layout_above : 在指定视图上方
layout_below : 在指定视图下方
layout_centerInParent : 在上级视图中间
layout_alignParentLeft : 与上级视图左侧对齐
layout_alignParentTop : 与上级视图上边对齐
layout_alignParentRight : 与上级视图右侧对齐
layout_alignParentBottom : 与上级视图下边对齐
layout_alignParentStart : 为了适配一些从右到左阅读习惯的地区。比如你要适配阿拉伯语的时候,start就代表右边,中文就是左边。
layout_alignParentEnd : 作用类似layout_alignParentStart


FrameLayout没有要特别指定的属性。


ScrollView因为是纵向滚动,所以android:layout_width只能是match_parent或具体数值,不能是wrap_content;android:layout_height则必须是wrap_content。相应的,HorizontalScrollView因为是横向滚动,所以android:layout_height只能是match_parent或具体数值,不能是wrap_content;android:layout_width则必须是wrap_content。



布局属性的代码编写

常用的如setLayoutParams、setGravity、setVisibility、setPadding等方法就不多说了,所有的控件和视图都可以使用这些方法,下面只列出几个需要特别处理的方法。


设置margin
方式一:
		ViewGroup.MarginLayoutParams vg_params = new ViewGroup.MarginLayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		vg_params.setMargins(0, 0, 0, 0);
方式二:
		LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		ll_params.setMargins(0, 0, 0, 0);
方式三:
		RelativeLayout.LayoutParams rl_params = new RelativeLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		rl_params.setMargins(0, 0, 0, 0);
其实setMargins来源于ViewGroup.MarginLayoutParams,后两种方式的LayoutParams都是继承自ViewGroup.MarginLayoutParams


设置weight
方式一:
		LinearLayout.LayoutParams ll_params1 = new LinearLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		ll_params1.weight = 1;
方式二:
		LinearLayout.LayoutParams ll_params2 = new LinearLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1);
从以上可以看出,只有LinearLayout.LayoutParams才可以设置weight


设置相对位置
相对位置必然要使用相对布局的参数设置,即addRule方法。该方法的第一个参数表示相对位置的属性,如是在相对上方还是相对下方还是相对左边还是相对右边,第二个参数表示视图id,即表示当前视图要相对于哪个视图。示例代码如下:
		RelativeLayout.LayoutParams rl_params = new RelativeLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		rl_params.addRule(RelativeLayout.ABOVE, 1);
		rl_params.addRule(RelativeLayout.BELOW, 1);
		rl_params.addRule(RelativeLayout.LEFT_OF, 1);
		rl_params.addRule(RelativeLayout.RIGHT_OF, 1);



点此查看Android开发笔记的完整目录








  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值