版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章Android单用户界面程序设计4.1Activity的概念
4.2布局与控件
4.3计算器工程
4.4小结
4.1Activity的概念
Android应用程序由四个基本的模块组成,即Activity(译为活动或活动界面)、Intent(意图)、ContentProvider(内容提供者)、Service(服务)。其中,Activity被视为应用程序界面的“画布”,即在Activity中布局并放置各种控件组成与用户交互的界面,Activity管理可视化界面的所有控件;其余三个组成模块将依次在第5章至第8章章介绍。
Activity类的继承关系为:
java.lang.Object→android.content.Context→android.content.ContextWrapper→android.view.ContextThemeWrapper→android.app.Activity上述各类为Activity类的父类,Android应用程序基于Java语言,Android应用程序框架所有的类均直接或间接继承类java.lang.Ojbect。直接继承Activity类的子类有ActivityGroup、ListActivity、ExpandableListActivity、NativeActivity、AccountAuthenticatorActivity和AliasActivity,间接继承Activity类的子类有类LauncherActivity、PreferenceActivity和TabActivity。当应用中只有一个Activity时,可通过配置AndroidManifest.xml使得应用程序启动时自动启动该Activity,并首先执行它的onCreate方法(见3.2节)。当应用中有多个Activity时,在当前运行的Activity中可调用startActivity或startActivityForResult方法启动一个新的Activity,方法startActivityForResult将借助onActivityResult方法在两个Activity间传递数据,新的Activity必须在AndroidManifest.xml中声明。
Activity类有150多种公有方法,其中大部分方法属于必须掌握的常用方法,请读者参考Android开发者手册。用户定义的活动界面类均需要继承Activity类,因此将继承Activity类的全部公有和保护方法。例如,以公有方法findViewById通过控件的ID号找到控件实例(对象)、调用公有方法setContentView设置用户界面布局或控件等。由于Android系统管理用户界面类的实例(对象),程序员只需要针对用户界面类进行界面设计即可,如添加布局(默认为线性布局)和控件(视图)、通过布局文件main.xml等。这一用户界面设计过程基本是所建即所得的。Eclipse软件的图形化布局方法功能有限,4.2.1节将介绍DroidDraw界面布局软件,可使得用户界面布局更加简单直观,而且DroidDraw也提供了一种学习用XML语言编写布局文件的有效途径。用户设计的活动界面类还要管理界面控件的事件响应处理方法,这些方法是使用Java事件响应机制工作的,通过实现监听事件的接口的抽象方法对各种控件事件进行响应。为了增强程序的可读性,后续章节的实例大多使用匿名内部类的方法(见2.6.3节)。
最后,需要强调的是,类属于数据结构的范畴,由数据成员和方法成员做构成。类不是执行单元,类中的方法执行需要创建类的实例(对象),可以把实例(对象)看作是类在内存中执行的一个实现。当然,因为一个类可以创建多个实例(对象),所以一个类可以有多个实现,即类的实例(对象)的执行对应着用户界面,而不是类。这一点在Android应用程序中完全得不到体现,好像Android用户界面对应着Activity类一样,这主要是因为Android应用程序框架隐藏了对活动界面对象的实现。总之,程序员必须要适应这种“在类中编写数据和方法,然后就直接运行程序”的新的Android程序设计理念。
4.2布 局 与 控 件
4.2.1布局软件DroidDraw
DroidDraw软件是Android应用程序界面设计与编辑器软件,可以运行在Windows或Linux环境下。该软件是用Java语言编写的,其最新版本为r1b18.1,压缩后的文件大小约为818KB。登录网站/下载文件droiddraw-r1b18.1.zip,解压后如图4-1所示。其中,droiddraw.exe是Windows系统可执行文件,droiddraw.jar是Java虚拟机可执行文件,双击图4-1中的droiddraw.exe文件进入DroidDraw软件主界面,如图4-2所示。图4-1DroidDraw软件包文件图4-2DroidDraw主界面在图4-2中,由右边的控件区随意拖几个控件到左边的黑色窗口中,然后点击左上角的“Generate”,将在右下区域的“Output”中产生XML布局代码。任意选中某个控件,可以在属性页(Properties)设置它的属性,然后点击“Apply”更新XML布局代码,如图4-3所示。将XML布局代码复制到Android应用程序工程中的布局文件中即可完成布局的设置。即使是Eclipse3.4.1版本,其集成的图形化布局功能仍然没有DroidDraw好用。DroidDraw软件是Android应用程序界面设计的必备工具,借助它可以大大节省用户界面布局的时间。图4-3DroidDraw生成的XML布局代码
例4.1
使用DroidDraw进行用户界面设计。
新建工程ex04_01,设置应用名为MyDroidDrawGUIApp、包名为cn.jxufe.zhangenhe、活动界面名为MyDroidDrawGUIAct和最小SDK版本号为10。
使用DroidDraw软件设计用户界面如图4-4所示,并设置各个控件的属性如表4-1所示。
图4-4中放置了两个TextView控件(静态文本框)、一个Button控件(命令按钮控件)、一个RadioGroup控件(单选钮组控件)和三个RadioButton(单选钮)。其中,单选钮组控件将放置其内的单选钮作为一组,同一组中只能有一个单选钮处于选中状态。单选钮也称作收音机按钮,这是因为单选钮看上去像收音机喇叭。图4-4DroidDraw拖放的控件表4-1图4-4中各控件的属性完成设置控件的属性后,点击图4-4上的“Generate”可生成如下所示的XML代码,这些代码位于DroidDraw右下角的“Output”区域。
1<?xmlversion="1.0"encoding="utf-8"?>
2<AbsoluteLayout
3android:id="@+id/widget0"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/
android"
7>
8<RadioGroup
9android:id="@+id/rbgMeans"
10android:layout_width="230px"
11android:layout_height="150px"
12android:layout_x="24px"
13android:layout_y="82px"
14>
15<RadioButton
16android:id="@+id/rbPlane"
17android:layout_width="210px"
18android:layout_height="50px"
19android:text="RadioButton1"
20>
21</RadioButton>
22<RadioButton
23android:id="@+id/rbShip"
24android:layout_width="210px"
25android:layout_height="50px"
26android:text="RadioButton2"
27>
28</RadioButton>
29<RadioButton
30android:id="@+id/rbTrain"
31android:layout_width="210px"
32android:layout_height="50px"
33android:text="RadioButton3"
34>
35</RadioButton>
36</RadioGroup>
37<TextView
38android:id="@+id/tvSlt"
39android:layout_width="200px"
40android:layout_height="40px"
41android:text="TextView1"
42android:layout_x="25px"
43android:layout_y="34px"
44>
45</TextView>
46<TextView
47android:id="@+id/tvMsg"
48android:layout_width="140px"
49android:layout_height="40px"
50android:text="TextView2"
51android:layout_x="299px"
52android:layout_y="116px"
53>
54</TextView>
55<Button
56android:id="@+id/btOK"
57android:layout_width="120px"
58android:layout_height="60px"
59android:text="Button1"
60android:layout_x="293px"
61android:layout_y="173px"
62>
63</Button>
64</AbsoluteLayout>第37~45行和第46~54行定义了两个静态文本框按钮,而第55~63行定义了一个命令按钮控件。从这些控件的定义来看,定义一个控件的XML语言格式是固定的,即:
<控件类型
控件属性
>
</控件类型>
以命令按钮为例,其控件类型为Button,控件的ID号为btOK,其宽和高分别为120px和60px,其显示的文本为Button1,在布局平面上的位置坐标为(293px,173px)。因此,其布局定义代码为:控件的多个属性在代码中的位置不分先后顺序,每种属性均以“Android:”开头。在定义控件ID号时,必须在ID号前添加“@+id/”。
将上述由DroidDraw产生的代码直接复制到工程ex04_01的布局文件main.xml中,覆盖其原来的代码,直接运行该工程,结果如图4-5所示。图4-5工程ex04_01运行结果由于Android显示界面是由各种资源组成的,包括字符串资源,因此当DroidDraw显示界面使用的资源与Android应用程序不同时,在DroidDraw中显示良好的界面有可能在Android应用程序中显示不正常。仔细比较图4-4和图4-5可以发现二者的细微差别,图4-5中的字体显示明显比图4-4大,而且更漂亮。通常由DroidDraw生成的布局代码应用于Android工程中时,其控件属性需要稍作调整,但是这些调整的工作量相对于从头至尾设计一个全新的布局文件而言是微不足道的。
显示图4-5所示界面,并没有改动源程序文件MyDroidDrawGUIAct.java,该文件的代码如下:
1packagecn.jxufe.zhangenhe;
2
3importandroid.app.Activity;
4importandroid.os.Bundle;
5
6publicclassMyDroidDrawGUIActextendsActivity{
7/**Calledwhentheactivityisfirstcreated.*/
8@Override
9publicvoidonCreate(BundlesavedInstanceState){
10super.onCreate(savedInstanceState);
11setContentView(R.layout.main);
12}
13}上述代码中的第11行将布局资源main显示在屏幕上,布局资源main对应于main.xml文件。事实上,图4-5所示界面中各控件显示的文本只表示了控件的类型,没有实际的意义。如果要求工程1显示如图4-6所示界面,则需要对工程ex04_01做进一步的完善。有两种方法可以修改用户界面控件的显示字符串,其一是直接在其XML布局文件中修改其“text”属性;其二是通过添加新的字符串资源文件实现,这种方法具有更好的通用性。图4-6工程ex04_01界面按照3.3.3节介绍的方法新建字符串资源文件strings_hz.xml,如图4-7所示添加六个字符串资源。每个字符串资源的格式固定,即:
<stringname="字符串名">字符串的值</string>
其中字符串名由英文字母、下划线或数字组成,且首字符必须为英文字母或下划线。图4-7字符串资源文件strings_hz.xml修改MyDroidDrawGUIAct.java的内容如下所示:
1packagecn.jxufe.zhangenhe;
2
3importandroid.app.Activity;
4importandroid.os.Bundle;
5importandroid.widget.Button;
6importandroid.widget.RadioButton;
7importandroid.widget.TextView;
8
9publicclassMyDroidDrawGUIActextendsActivity{
10 privateTextViewtvSlt,tvMsg;
11 privateRadioButtonrbMeans;
12 privateButtonbtOK;
13
14/**Calledwhentheactivityisfirstcreated.*/
15@Override
16publicvoidonCreate(BundlesavedInstanceState){
17super.onCreate(savedInstanceState);
18setContentView(R.layout.main);
19tvSlt=(TextView)findViewById(R.id.tvSlt);
20tvSlt.setText(R.string.strSlt);
21rbMeans=(RadioButton)findViewById(R.id.rb
Plane);
22rbMeans.setText(R.string.strPlane);
23rbMeans=(RadioButton)findViewById(R.id.rb
Ship);
24rbMeans.setText(R.string.strShip);
25rbMeans=(RadioButton)findViewById(R.id.rb
Train);
26rbMeans.setText(R.string.strTrain);
27tvMsg=(TextView)findViewById(R.id.tvMsg);
28tvMsg.setText(R.string.strMsg);
29btOK=(Button)findViewById(R.id.btOK);
30btOK.setText(R.string.strOK);
31}
32}由于第19~30行的代码实现对界面的初始化显示,因此将它们单独放在一个私有方法中可增强程序的可读性,即上述代码中第9行以后的代码改写为如下所示:
9publicclassMyDroidDrawGUIActextendsActivity{
10 privateTextViewtvSlt,tvMsg;
11 privateRadioButtonrbMeans;
12 privateButtonbtOK;
13
14/**Calledwhentheactivityisfirstcreated.*/
15@Override
16publicvoidonCreate(BundlesavedInstanceState){
17super.onCreate(savedInstanceState);
18setContentView(R.layout.main);
19myInitGUI();
20}
21privatevoidmyInitGUI(){
22 tvSlt=(TextView)findViewById(R.id.tvSlt);
23tvSlt.setText(R.string.strSlt);
24rbMeans=(RadioButton)findViewById(R.id.rb
Plane);
25rbMeans.setText(R.string.strPlane);
26rbMeans=(RadioButton)findViewById(R.id.rb
Ship);
27rbMeans.setText(R.string.strShip);
28rbMeans=(RadioButton)findViewById(R.id.rb
Train);
29rbMeans.setText(R.string.strTrain);
30tvMsg=(TextView)findViewById(R.id.tvMsg);
31tvMsg.setText(R.string.strMsg);
32btOK=(Button)findViewById(R.id.btOK);
33btOK.setText(R.string.strOK);
34}
35}4.2.2控件事件响应方法
在图4-6所示界面上,要求点击“确定”按钮,在“您选择了”静态文本框中显示选中的单选钮的信息,即如果“飞机”单选钮选中了,点击“确定”按钮,将显示“您选择了飞机”。为实现该功能,需要为“确定”按钮添加事件处理方法。在2.6节介绍了Java语言中使用公有类、内部类和匿名内部类方法实现控件事件响应的方法,这些方法对于Android应用程序用户界面的控件来说同样有效,而且这三种方法本质上是相同的。这里将继续介绍使用匿名内部类响应控件事件的方法,同时再介绍一种基于布局文件响应用户事件的方法。
例4.2
使用匿名内部类响应控件事件。
在工程ex04_01的基础上新建工程ex04_02,此时除了应用名为MyClassEventApp和活动界面名为MyClassEventAct外,其他与工程ex04_01完全相同。然后,修改源程序文件MyClassEventAct.java。
新的MyClassEventAct.java内容如下所示:
1packagecn.jxufe.zhangenhe;
2
3importcn.jxufe.zhangenhe.R.id;
4importandroid.app.Activity;
5importandroid.os.Bundle;
6importandroid.view.View;
7importandroid.view.View.OnClickListener;
8importandroid.widget.Button;
9importandroid.widget.RadioButton;
10importandroid.widget.RadioGroup;
11importandroid.widget.TextView;
12
13publicclassMyClassEventActextendsActivity{
14 privateTextViewtvSlt,tvMsg;
15 privateRadioButtonrbPlane,rbShip,rbTrain;
16 privateRadioGrouprbgMeans;
17 privateButtonbtOK;
18/**Calledwhentheactivityisfirstcreated.*/
19@Override
20publicvoidonCreate(BundlesavedInstanceState){
21super.onCreate(savedInstanceState);
22setContentView(R.layout.main);
23myInitGUI();
24}
25privatevoidmyInitGUI(){
26 tvSlt=(TextView)findViewById(R.id.tvSlt);
27tvSlt.setText(R.string.strSlt);
28rbPlane=(RadioButton)findViewById(R.id.rb
Plane);
29rbPlane.setText(R.string.strPlane);
30rbPlane.setChecked(true);
31rbShip=(RadioButton)findViewById(R.id.rb
Ship);
32rbShip.setText(R.string.strShip);
33rbTrain=(RadioButton)findViewById(R.id.rb
Train);
34rbTrain.setText(R.string.strTrain);
35tvMsg=(TextView)findViewById(R.id.tvMsg);
36tvMsg.setText(R.string.strMsg);
37btOK=(Button)findViewById(R.id.btOK);
38btOK.setText(R.string.strOK);
39rbgMeans=(RadioGroup)findViewById(id.rbg
Means);
40btOK.setOnClickListener(newOnClickListener(){
41 @Override
42 publicvoidonClick(Viewv){
43 //TODOAuto-generatedmethodstub
44 tvMsg.setText(get
Resources().getString(R.string.strMsg)+
45 ((RadioButton)findViewById(工程ex04_02的运行结果如图4-8所示。图4-8工程ex04_02执行结果
例4.3
基于布局文件属性响应用户控件事件。
在工程ex04_01的基础上新建工程ex04_03,除了应用名为MyResourceEventApp和活动界面名为MyResourceEventAct外,其他与工程ex04_01完全相同。然后,修改布局文件main.xml,即在Button属性(这里只有一个ID为btOK的命令按钮控件)中添加onClick属性。如图4-9所示,“android:onClick="myBtOKClick"”,表示当命令按钮btOK被点击时,Android系统将调用myBtOKClick方法,该方法必须被定义为类MyResourceEventAct中的公有方法,且具有一个View类型参数。图4-9main.xml文件中的Button属性修改后的MyResourceEventAct.java代码如下所示:
1packagecn.jxufe.zhangenhe;
2
3importandroid.app.Activity;
4importandroid.os.Bundle;
5importandroid.view.View;
6importandroid.widget.Button;
7importandroid.widget.RadioButton;
8importandroid.widget.RadioGroup;
9importandroid.widget.TextView;
10
11publicclassMyResourceEventActextendsActivity{
12 privateTextViewtvSlt,tvMsg;
13 privateRadioButtonrbPlane,rbShip,rbTrain;
14 privateRadioGrouprgMeans;
15 privateButtonbtOK;
16/**Calledwhentheactivityisfirstcreated.*/
17@Override
18publicvoidonCreate(BundlesavedInstanceState){
19super.onCreate(savedInstanceState);
20setContentView(R.layout.main);
21myInitGUI();
22}
23privatevoidmyInitGUI(){
24 tvSlt=(TextView)findViewById(R.id.tvSlt);
25tvSlt.setText(R.string.strSlt);
26rbPlane=(RadioButton)findViewById(R.id.rb
Plane);
27rbPlane.setText(R.string.strPlane);
28rbPlane.setChecked(true);
29rbShip=(RadioButton)findViewById(R.id.rbShip);
30rbShip.setText(R.string.strShip);
31rbTrain=(RadioButton)findViewById(R.id.rbTrain);
32rbTrain.setText(R.string.strTrain);工程ex04_03的运行结果如图4-10所示。图4-10工程ex04_03的运行结果
例4.4
单选钮事件演示。
单选钮的继承关系如下:
java.lang.Object→android.view.View→android.widget.TextView→android.widget.Button→android.widget.CompoundButton→android.widget.RadioButton
即单选钮类间接继承了命令按钮类,因此单选钮与命令按钮一样,也具有点击事件。事实上,几乎所有控件都具有点击事件。例4.3的功能是选择了单选钮之后,点击“确定”按钮,然后显示诸如“您选择了列车”这类提示信息。本例中将添加单选钮的点击事件,当点击某个单选钮时,将弹出一条诸如“您选择了列车”的信息,然后这个信息框会自动消失Android系统的Toast类可实现这种功能,该类具有一个静态方法makeText和一个动态方法show,其原型如下:
1publicstaticToastmakeText(Contextcontext,intresId,intduration);
2publicstaticToastmakeText(Contextcontext,CharSequencetext,intduration);
3publicvoidshow();这里,context参数表示显示提示信息的对象;resId和text分别表示字符串资源索引号和字符串;duration表示显示提示信息的时间,只能输入LENGTH_SHORT或LENGTH_LONG,这两个量为Toast类的静态常量,表示显示信息的时间比较短或比较长。使用Toast短暂显示一条信息的典型用法为:
Toast.makeText(this,"Iamatoastmessage!",Toast.LENGTH_SHORT).show();这条语句首先使用Toast.makeText创建一个Toast类型对象(因为静态方法makeText返回一个Toast类型对象),再用这个对象调用其show方法显示字符串“Iamatoastmessage!”。Toast提示信息的位置一般位于屏幕下方的中央。
现在,在工程ex04_03的基础上,新建工程ex04_04,除了应用名为MyRadioEventApp和活动界面名为MyResourceEventAct外,其他与工程ex04_03完全相同。然后,修改布局文件main.xml,为每个单选钮添加onClick属性,如图4-11所示。图4-11main.xml文件中单选钮添加的“onClick”属性从图4-11中可以看出,三个单选钮的“onClick”属性均为“myRbMeansClick”,表明在用户界面上无论点击哪个单选钮,都将执行同一个公有方法即myRbMeansClick。然后在MyRadioEventAct.java文件中添加方法myRbMeansClick即可(该文件的其他代码没有变动)。新添加的方法myRbMeansClick的代码如下:
1publicvoidmyRbMeansClick(Viewv){
2 rgMeans=(RadioGroup)findViewById(R.id.rbgMeans);
3 Toast.makeText(this,getResources().getString(R.string.strMsg)+
4 ((RadioButton)findViewById(
5
rgMeans.getCheckedRadioButtonId())).getText(),
6 Toast.LENGTH_SHORT).show();
7}
工程ex04_04的执行结果如图4-12所示。当只点击单选钮而不点击“确定”按钮时,将弹出一个提示信息,稍后该信息自动消失,而“确定”按钮上方只显示“您选择了”。当点击“确定”按钮后,则显示诸如“您选择了列车”之类的信息。图4-12工程ex04_04的执行结果
Android系统各种布局下使用亮黑色作为默认背景色,可以在工程中添加颜色资源文件myguicolor.xml(借助菜单File|New|Other|AndroidXMLFile创建)。该文件位于资源res下的values目录中,其内容如下:
1<?xmlversion="1.0"encoding="utf-8"?>
2<resources>
3<colorname="mywincyan">#FF006666</color>
4</resources>更新工程后(按F5),将在自动产生的gen资源目录下出现“R|color|mywincyan”,定义颜色的方式主要是#AARRGGBB或#RRGGBB,“#”表示用十六进制数表示,“AA”表示透明程度的alpha值,“RRGGBB”依次表示红、绿、蓝的值。第3行定义的颜色为#FF006666,即青色。定义颜色的另一个方式是用drawable关键字,第3行也可以写为:
<drawablename="mywincyan">#FF006666</drawable>
使用drawable定义的颜色用R.drawable.mywincyan访问。
然后,在main.xml文件中为AbsoluteLayout添加背景,即加入图4-13中圈住的一条语句“android:background="@color/mywincyan"”。图4-13添加背景色这时运行工程ex04_04,其结果如图4-14所示(图中以灰度显示青色)。图4-14工程ex04_04采用青色背景的效果(图中以灰度显示)4.2.3Android常用控件
Android系统与Activity(活动界面)直接相关的控件(视图)可分为七大类,即窗体控件、布局控件、复合控件、图像与多媒体控件、时间与时历控件、切换控件和高级控件,将它们分别列于表4-2~表4-8中。表4-2窗体控件表4-3布局控件表4-4复合控件表4-5图像与多媒体控件表4-6时间与日历控件表4-7切换控件表4-8高级控件4.2.4线性布局
线性布局(LinearLayout)分为水平方向线性布局和垂直方向线性布局。当设置为水平方向布局时,控件在水平方向上依次摆放,如果控件在水平方向上超出屏幕显示范围,控件也不会换行摆放;当设置为垂直方向布局时,控件垂直方向依次摆放,即使有两个控件在同一行中能摆放下,它们也要按列摆放,如图4-15所示。图4-15垂直线性布局
例4.5
实现图4-15的布局。
新建工程ex04_05,应用名为MyDateTimeApp,包名为cn.jxufe.zhangenhe,活动界面名为MyDateTimeAct,最小SDK版本号为10。工程ex04_05中需要编辑的文件有MyDateTimeAct.java、main.xml、myguicolor.xml和strings.xml。其中,文件myguicolor.xml与工程ex04_04中的同名文件相同,strings.xml文件修改如下:
1<?xmlversion="1.0"encoding="utf-8"?>
2<resources>
3<stringname="str_gettime">GetPickerTime</string>
4<stringname="app_name">MyDateTimeApp</string>
5</resources>
第3行中设置名为str_gettime的字符串“GetPickerTime”。
文件main.xml是图4-15的布局文件,其内容如下所示:
1<?xmlversion="1.0"encoding="utf-8"?>
2<LinearLayout
3android:id="@+id/widget29"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6android:orientation="vertical"上述代码的布局显示结果如图4-15所示。其中,点击命令按钮“GetPickerTime”后会短暂弹出当前日期和时间的设定值(用Toast类实现)。
文件MyDateTimeAct.java的代码如下所示:
1packagecn.jxufe.zhangenhe;
2
3importandroid.app.Activity;
4importandroid.os.Bundle;
5importandroid.view.View;
6importandroid.widget.DatePicker;
7importandroid.widget.TimePicker;
8importandroid.widget.Toast;
9
10publicclassMyDateTimeActextendsActivity{
11 DatePickerdatePicker;
12 TimePickertimePicker;
13/**Calledwhentheactivityisfirstcreated.*/
14@Override
15publicvoidonCreate(BundlesavedInstanceState){
16super.onCreate(savedInstanceState);
17setContentView(R.layout.main);
18}
19publicvoidmyDispPickerTime(Viewv){4.2.5相对布局
相对布局(RelativeLayout)中,第一个控件可以摆放在布局平面的九个位置,即左上、中上、右上、左中、中央、右中、左下、中下和右下方;第二个控件可以相对于第一个控件指定摆放位置,即它的上方、下方、左边和右边等;第三个控件则可以相对于前两个控件指定摆放的位置,依次类推。例如下面的布局文件main.xml,该文件中放置了两个控件ImageButton和Chronometer。
1<?xmlversion="1.0"encoding="utf-8"?>
2<RelativeLayout
3android:id="@+id/widget29"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/android"
7android:background="@color/mywincyan"
8>
9<ImageButton
10android:id="@+id/imageBtn"
11android:layout_width="wrap_content"
12android:layout_height="wrap_content"
13android:layout_centerVertical="true"
14android:layout_centerHorizontal="true"
15android:onClick="myChronoStart"
16android:src="@drawable/mychronostart"
17>
18</ImageButton>
19<Chronometer
20android:id="@+id/chronoMeter"
21android:layout_width="wrap_content"
22android:layout_height="wrap_content"
23android:layout_above="@+id/imageBtn"
24android:layout_centerHorizontal="true"
25>
26</Chronometer>
27</RelativeLayout>
例4.6
相对布局演示。
新建工程ex04_06,使用上面的main.xml布局文件,应用名为MyChronoscopeApp,包名为cn.jxufe.zhangenhe,活动界面名为MyChronoscopeAct。工程ex04_06如图4-16所示,其中,为图形按钮控件添加了一个图片mychronostart.png,文件MyChronoscopeAct.java的代码如图4-16的右边所示。图4-16工程ex04_06界面在图4-16的右边代码部分中,关于类MyChronoscopeAct的代码重新列在下面
8publicclassMyChronoscopeActextendsActivity{
9 privateChronometerchronoMeter;
10/**Calledwhentheactivityisfirstcreated.*/
11@Override
12publicvoidonCreate(BundlesavedInstanceState){
13super.onCreate(savedInstanceState);
14setContentView(R.layout.main);
15}
16publicvoidmyChronoStart(Viewv){
17 chronoMeter=(Chronometer)findViewById(R.id.chronoMeter);
18 chronoMeter.setFormat("Ihaveworkedfor:%s");
19 chronoMeter.start();
20}
21}
工程ex04_06的执行结果如图4-17所示。点击“启动计时”按钮后,显示计时值。当显示时间超过1小时时,将以格式“小时:分:秒”的方式显示。图4-17工程ex04_06的执行结果4.2.6框架布局
前面介绍的线性布局和相对布局占有整个屏幕(也可占有部分屏幕),而框架布局(FrameLayout)则不同,它一般占有屏幕的一块区域,如图4-18所示。图4-18框架布局在图4-18中,屏幕布局为相对布局(图中黑色区域),在其上有一个框架布局(图中青色区域,以灰度显示),框架布局中放置了一个EditText文本编辑框(图中白色区域),其布局文件main.xml如下所示:
1<?xmlversion="1.0"encoding="utf-8"?>
2<RelativeLayout
3android:id="@+id/widget45"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/android"
7>
8<FrameLayout
9android:id="@+id/widget46"
10android:layout_width="398px"
11android:layout_height="299px"
12android:layout_alignParentTop="true"
13android:layout_centerHorizontal="true"
14android:background="@color/mywincyan"
15>
16<EditText
17android:id="@+id/widget47"
18android:layout_width="396px"
19android:layout_height="wrap_content"
20android:text="EditText"
21android:textSize="18sp"
22>
23</EditText>
24</FrameLayout>
25</RelativeLayout>
例4.7
框架布局实例。
新建工程ex04_07,应用名为MyFrameLtApp,包名为,活动界面名为MyFrameLtAct,添加上述的main.xml布局文件以及一个资源文件myguicolor.xml(该文件与工程ex04_04中的同名文件相同),运行程序可得如图4-18所示结果。4.2.7表格布局
有两种表格布局方式(TableLayout和TableRow)。其中,TableLayout类似于垂直方式的线性布局,在这种方式下,每个控件按垂直方向顺序排列;而TableRow类似于水平方式的线性布局,在这种方式下,各个控件水平方向依次排列。两个表格布局方式结合起来可实现类似于表格形式的布局。表格布局TableLayout可以作为屏幕布局,而TableRow只能放置在其他布局中,如线性布局、相对布局和绝对布局,通常配合TableLayout布局使用。
例4.8
表格布局演示。
新建工程ex04_08,应用名为MyTableLtApp,包名为cn.jxufe.zhangenhe,活动界面名为MyTableLtAct。在工程文件中添加一个颜色资源文件myguicolor.xml,其代码如下所示:
1<?xmlversion="1.0"encoding="utf-8"?>
2<resources>
3<drawablename="darkgray">#FF404040</drawable>
4<drawablename="black">#FF000000</drawable>
5<drawablename="red">#FFFF0000</drawable>
6<drawablename="green">#FF00FF00</drawable>
7<drawablename="lightgray">#FFC0C0C0</drawable>
8<drawablename="white">#FFFFFFFF</drawable>
9<drawablename="yellow">#FFFFFF00</drawable>
10<drawablename="blue">#FF0000FF</drawable>
11<drawablename="gray">#FF808080</drawable>
12<drawablename="magenta">#FFFF00FF</drawable>
13<drawablename="cyan">#FF00FFFF</drawable>
14</resources>上述代码中的第3~13行依次表示暗灰、黑、红、绿、浅灰、白、黄、蓝、灰、品红和青色,每种颜色值的格式为“#AARRGGBB”。其中,AA表示透明程度,RR表示红色分量的值,GG表示绿色分量的值,BB表示蓝色分量的值。
然后,修改布局文件main.xml如下所示:
1<?xmlversion="1.0"encoding="utf-8"?>
2<TableLayout
3android:id="@+id/tablelt"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6android:orientation="vertical"
7xmlns:android="/apk/res/android"
8android:background="@drawable/darkgray"
9>
10<TableRow
11android:id="@+id/tablerow1"
12android:layout_width="fill_parent"
13android:layout_height="wrap_content"
14android:orientation="horizontal"
15android:background="@drawable/red"
16>
17<EditText
18android:id="@+id/edit1"
19android:layout_width="wrap_content"
20android:layout_height="wrap_content"
21android:text="EditText"
22android:textSize="18sp"
23>
24</EditText>
25</TableRow>
26<TableRow
27android:id="@+id/tablerow2"
28android:layout_width="fill_parent"
29android:layout_height="wrap_content"
30android:orientation="horizontal"
31android:background="@drawable/yellow"
32>
33<EditText
34android:id="@+id/edit2"
35android:layout_width="wrap_content"
36android:layout_height="wrap_content"
37android:text="EditText"
38android:textSize="18sp"
39>
40</EditText>
41<EditText
42android:id="@+id/edit3"
43android:layout_width="wrap_content"
44android:layout_height="wrap_content"
45android:text="EditText"
46android:textSize="18sp"
47>
48</EditText>
49</
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年绿色能源项目合伙人共同投资合作协议范本3篇
- 多元化资产管理合同
- 办公室空间利用合同
- 网络文化产品交易服务平台协议
- 常用购销合同
- 软件知识产权保护协议
- 2025版医疗健康企业100%股权出售及合作开发合同3篇
- 消防工程施工简单协议书
- 少儿百科知识故事征文
- 水稳料采购合同协议书
- 8.制作豆腐 教案 2023-2024学年江苏凤凰出版社九年级劳动技术
- 《联合国教科文:学生人工智能能力框架》-中文版
- 合同债务人变更协议书模板
- 高中生物必修一知识点总结(必修1)
- 《风力发电技术》课件-第三章 机组运行与维护
- 2024年高中生物新教材同步选择性必修第三册学习笔记第4章 本章知识网络
- 物料报废回收合同范本
- 西班牙可再生能源行业市场前景及投资研究报告-培训课件外文版2024.6光伏储能风电
- 科研机构成果转化困境与对策
- 选矿厂建设课件
- DB32T4065-2021建筑幕墙工程技术标准
评论
0/150
提交评论