布局视图的类别
布局视图有五类,分别是线性布局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开发笔记的完整目录