实战Android编程——手把手教你做出商用软件34第3章Android布局管理器本章要介绍的内容为Android平台下的布局管理器。Android中的布局包括线性布局、表格布局、相对布局、帧布局和绝对布局。下面将分别对每个布局管理器进行详细的介绍。3.1控件类概述3.1.1View类简介在介绍Android的布局管理器之前,有必要让读者了解Android平台下的控件类。首先要了解的是View类,该类为所有可视化控件的基类,主要提供了控件绘制和事件处理的方法。创建用户界面所使用的控件都继承自View,如TextView、Button、CheckBox等。关于View及其子类的相关属性,既可以在布局XML文件中进行设置,也可以通过成员方法在代码中动态设置。View类常用的属性及其对应方法如表3-1所示。表3-1View类常用属性及对应方法说明属性名称对应方法描述android:backgroundsetBackgroundResource(int)设置背景android:clickablesetClickable(boolean)设置View是否响应点击事件android:visibilitysetVisibility(int)控制View的可见性android:focusablesetFocusable(boolean)控制View是否可以获取焦点android:idsetId(int)为View设置标识符,可通过findViewById方法获取android:longClickablesetLongClickable(boolean)设置View是否响应长点击事件android:soundEffectsEnabledsetSoundEffectsEnabled(boolean)设置当View触发点击等事件时是否播放音效android:saveEnabledsetSaveEnabled(boolean)如果未作设置,当View被冻结时将不会保存其状态android:nextFocusDownsetNextFocusDownId(int)定义当向下搜索时应该获取焦点的View,如果该View不存在或不可见,则会抛出RuntimeException异常android:nextFocusLeftsetNextFocusLeftId(int)定义当向左搜索时应该获取焦点的Viewandroid:nextFocusRightsetNextFocusRightId(int)定义当向右搜索时应该获取焦点的View续表属性名称对应方法描述android:nextFocusUpsetNextFocusUpId(int)定义当向上搜索时应该获取焦点的View,如果该View第3章Android布局管理器35不存在或不可见,则会抛出RuntimeException异常说明:任何继承自View的子类都将拥有View类的以上属性及对应方法。3.1.2ViewGroup类简介另外一个需要了解的是ViewGroup类,它也是View类的子类,但是可以充当其他控件的容器。ViewGroup的子控件既可以是普通的View,也可以是ViewGroup,实际上,这是使用了Composite的设计模式。Android中的一些高级控件如Galley、GridView等都继承自ViewGroup。与JavaSE不同,Android中并没有设计布局管理器,而是为每种不同的布局提供了一个ViewGroup的子类,常用的布局及其类结构如图3-1所示。3.2线性布局本节将会对线性布局进行简单的介绍。首先向读者介绍LinearLayout类的相关知识,然后通过一个实例说明LinearLayout的用法。3.2.1LinearLayout类简介线性布局是昀简单的布局之一,它提供了控件水平或者垂直排列的模型。同时,使用此布局时可以通过设置控件的weight参数控制各个控件在容器中的相对大小。LinearLayout布局的属性既可以在布局文件(XML)中设置,也可以通过成员方法进行设置。表3-2给出了LinearLayout常用的属性及这些属性的对应设置方法。表3-2LinearLayout常用属性及对应方法属性名称对应方法描述android:orientationsetOrientation(int)设置线性布局的朝向,可取horizontal和vertical两种排列方式android:gravitysetGravity(int)设置线性布局的内部元素的布局方式在线性布局中可使用gravity属性来设置控件的对齐方式,gravity可取的值及说明如表3-3所示。提示:当需要为gravity设置多个值时,用“|”分隔即可。表3-3gravity可取的属性及说明属性值说明top不改变控件大小,对齐到容器顶部续表属性值说明bottom不改变控件大小,对齐到容器底部图3-1布局管理器的类结构实战Android编程——手把手教你做出商用软件36left不改变控件大小,对齐到容器左侧right不改变控件大小,对齐到容器右侧center_vertical不改变控件大小,对齐到容器纵向中央位置center-horizontal不改变控件大小,对齐到容器横向中央位置center不改变控件大小,对齐到容器中央位置fill_vertical若有可能,纵向拉伸以填满容器fill_horizontal若有可能,横向拉伸以填满容器fill若有可能,纵向横向同时拉伸以填满容器3.2.2线性布局案例在前面的章节中介绍了LinearLayout类的相关知识,本节将通过一个案例来说明LinearLayout的用法。本案例的开发步骤如下。在Eclipse中新建一个项目Sample_3_1,首先打开项目文件夹下res/values目录下的strings.xml,在其中输入如下代码。1?xmlversion=1.0encoding=utf-8?2resources3stringname=app_nameLinearExample/string4stringname=button按钮/string5stringname=add添加/string6/resources代码位置:见随书光盘中源代码/第3章/Sample_3_1/res/values目录下的strings.xml。说明:在strings.xml中主要声明了程序中要用到的字符串资源,这样将所有字符串资源统一管理有助于提高程序的可读性及可维护性。打开项目文件夹下的res/layout目录下的main.xml,将其中已有的代码替换为如下代码。1?xmlversion=1.0encoding=utf-8?2LinearLayoutxmlns:android=:orientation=vertical4android:layout_width=fill_parent5android:layout_height=fill_parent6android:id=@+id/lla7android:gravity=right8!--声明一个LinearLayout布局,并设置其属性--9Button10android:text=@string/add11android:id=@+id/Button0112android:layout_width=wrap_content13android:layout_height=wrap_content14/Button!--声明一个Button布局,并设置其id为Button01--15/LinearLayout代码位置:见随书光盘中源代码/第3章/Sample_3_1/res/layout目录下的main.xml。¾第2~8行声明了一个线性布局,第3行设置线性布局的朝向为垂直排列。¾第4~5行设置该线性布局在其所属的父容器中的布局方式为横向和纵向填充父容器。¾第6行为该线性布局声明了ID。第7行设置该线性布局内部元素的布置方式为向右对齐。第3章Android布局管理器37¾第9~14行声明了一个Button控件,其ID为Button01,第10行设置Button控件显示的文本内容为资源文件strings.xml中的属性值。¾第12~13行设置Button控件在父容器中的布局方式为只占据自身大小的空间。打开项目的Activity文件LinearActivity.java,将其中已有的代码替换为如下的代码。1packagewyf.jc;//声明包语句2importandroid.app.Activity;//引入相关类3importandroid.os.Bundle;//引入相关类4importandroid.view.View;//引入相关类5importandroid.widget.Button;//引入相关类6importandroid.widget.LinearLayout;//引入相关类7publicclassLinearActivityextendsActivity{8intcount=0;//计数器,记录按钮个数9@Override10publicvoidonCreate(BundlesavedInstanceState){//重写onCreate方法11super.onCreate(savedInstanceState);12setContentView(R.layout.main);13Buttonbutton=(Button)findViewById(R.id.Button01);//获取屏幕中的按钮控件对象14button.setOnClickListener(//为按钮添加OnClickListener接口实现15newView.OnClickListener(){16publicvoidonClick(Viewv){17LinearLayoutll=(LinearLayout)findViewById(R.id.lla);//获取线性布局对象18Stringmsg=LinearActivity.this.getResources().getString(R.string.button);19Buttontempbutton=newButton(LinearActivity.this);//创建一个Button对象20tempbutton.setText(msg+(++count));//设置Button控件显示的内容21tempbutton.setWidth(80);//设置Button的宽度22ll.addView(tempbutton);//向线性布局中添加View23}24});25}26}代码位置:见随书光盘中源代码/第3章/Sample_3_1/src/wyf/jc目录下的main.xml。¾代码第8行声明了用于记录生成的按钮编号的计数器。¾代码第13行通过findViewById方法获取屏幕中的Button控件对象。¾代码第15~24行为Button对象添加了OnClickListener监听器的实现。¾代码第17~23行为对OnClickListener接口中onClick方法的实现,在该方法中首先获得线性布局LinearLayout对象的引用,然后创建一个Button对象并调用LinearLayout对象的addView方法将其添加到线性布局容器中。完成上述三个步骤的工作后,运行项目,在程序中单击“添加”按钮可向屏幕中添加新的按钮,效果图如图3-2所示。图3-2为当LinearLayout的orientation属性为vertical时的运行效果,下面来看orientation值为horizontal时的运行效果,将步骤中的第3行代码改为如下代码。1android:orientation=horizontal代码位置:见随书光