3.2 LinearLayout:线性布局管理器

线性布局管理器会将容器中的组件一个一个排列起来,LinearLayout可以通过android: orientation属性控制组件横向或者纵向排列。线性布局中的组件不会自动换行,当组件一个一个排列到尽头之后,剩下的组件就不会显示出来了。

3.2.1 LinearLayout实例及属性详解

LinearLayout布局文件实例:

图3-2 线性布局效果图

程序中定义了3个文本显示控件,采用了vertical(垂直)布局,运行效果如图3-2所示。

在上述LinearLayout布局文件实例中可以清晰地看出,LinearLayout内部的子元素是按照线性布局的,也可以看出布局文件中包含了LinearLayout的一些常用属性:

• android:layout_width 设置当前组件的宽度,match_parent表示充满整个父元素,若使用wrap_content则意味着组件多大就多大。

• android:layout_height 设置当前组件的高度,match_parent表示充满整个父元素,若使用wrap_content则意味着组件多大就多大。

• android:orientation 当设置成vertical时表示布局容器内的控件纵向排列成1列,当设置成horizontal时表示布局容器内的所有控件横向排列成1行。

• android:layout_weight 为容器内的组件设置权重,表示当所有控件全部排列完毕后被设置的组件占父容器剩余空白部分的比重。

• android:layout_gravity 为容器内的控件设置该控件在父容器中的对齐方式,当父容器线性设置为vertical纵向时,只有设置与左右相关的值才起作用,比如left、right;当父容器线性设置为horizontal横向时,只有设置与上下相关的值才起作用,比如top、bottom。

• android:gravity 设置控件上面的内容在该组件里面的对齐方式。

• android:visibility 默认为visibility,表示显示;设置为invisibility不显示,但是还会占据位置,留一个空白区域;设置成gone表示真正的完全隐藏。

3.2.2 使用代码控制线性布局管理器

正如3.1节所讲,在Android中所有的组件都是android.view.View类的子类,LinearLayout类也不例外。对于这些android.view.View类的组件,除了使用配置文件的形式进行布局管理器的定义之外,还可以使用Java代码来动态控制。Android.widget.LinearLayout类的重要操作方法和常量如表3-1所示。

表3-1 LinearLayout类的重要方法和常量

另外,如果要使用程序控制LinearLayout布局管理器的操作,还需要对一些布局参数进行配置,这些参数都保存在ViewGroup.LayoutParams类中,线性布局的参数保存在ViewGroup. LayoutParams类的子类LinearLayout.LayoutParams类中。LinearLayout.LayoutParams类的结构图如图3-3所示。

图3-3 LinearLayout.LayoutParams类的结构图

LinearLayout.LayoutParams类提供了一个构造方法,具体如下:

在创建布局参数时需要传递布局参数的宽度和高度,而这两个布局参数可以通过ViewGroup.LayoutParams类提供的FILL_PARENT(充满父元素)和WRAP_CONTENT(包裹自身内容)两个常量参数来控制。

通过代码生成、控制布局管理器的代码实例如下:

图3-4 代码控制线性布局管理器效果

这个程序通过Java代码直接控制线性布局管理器和它的子元素,最终又通过addContentView方法使线性布局管理器在这个Activity中展示出来。程序实现的效果如图3-4所示。

在上面的程序中使用了addContentView(View,LayoutParams)方法。这是Activity类向Activity中增加View的方法。之前,我们会发现每次使用一个Activity都会默认调用setContentView(View)方法。setContentView(View)方法也是设置Activity View的方法。那么两个方法有什么区别呢?

两者的区别主要包括两点:

• 在此之前已添加的UI组件是否被移除。setContentView(View)会导致先前添加的被移除,即替换性的;而addContentView(View,LayoutParams)不会移除先前添加的UI组件,即累积性的。

• 是否控制布局参数。addContentView(View,LayoutParams)有两个参数,可以控制布局参数;setContentView(View)没有接收布局参数,默认使用MATCH_PARENT,不过setContentView(View)也有带两个参数的版本,可以控制布局参数,这里不再讲解。