《Google Android开发技术》课件第5章_第1页
《Google Android开发技术》课件第5章_第2页
《Google Android开发技术》课件第5章_第3页
《Google Android开发技术》课件第5章_第4页
《Google Android开发技术》课件第5章_第5页
已阅读5页,还剩199页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章Android多用户界面程序设计5.1Intent的概念

5.2对话框

5.3菜单

5.4多用户界面设计

5.5小结

5.1Intent的概念

Intent(译为意图)提供了不同Activity(活动界面)间数据交换的方法,被视为Activity之间的纽带,它所传递的信息主要是动作(Action)和数据(data),即要执行的动作和要操作的数据。动作使用Android系统预定义的常量表示,例如ACTION_MAIN、ACTION_VIEW和ACTION_EDIT等;数据使用URI(统一资源标识符)表示。借助Intent对象,调用方法startActivity可启动一个新的界面;调用方法startService或bindService可与服务(没有用户界面的应用程序)通信;调用方法sendBroadcast与所有广播接收器通信。此外,Intent

还具有category(分类)、type(类型)、component(组件)和extras(附加信息)等属性。其中,category为动作提供分类信息;type用于显式指定MIME(多用途网络邮件扩展)类型;component显式指定Intent使用的组件类;extras是一个Bundle对象,包括附加的数据信息。

有两种使用Intent的方法即显式使用和隐式使用。显式Intent通过调用方法setClass或setComponent运行一个指定的类,这是应用程序装入新的活动界面(Activity)时常用的方法。隐式Intent不指定特定的组件或类,由Android系统寻找与该Intent描述的动作和数据匹配的组件执行,这一种过程称为Intent解析机制。Intent解析器将Intent映射到一个匹配的Activity、广播接收器(BroadcastReceiver)或服务(Service)。Intent解析器根据应用程序的AndroidManifest.xml文件中IntentFilter包含的动作(action)、类型(type)或分类(category)等信息,决定Intent信息传递的对象。为了介绍隐式Intent的使用方法,下面以“记事本”应用程序的AndroidManifest.xml为例说明,该文件内容如下所示:

1<manifestxmlns:android="/apk/res/android"

2package="com.android.notepad">

3<applicationandroid:icon="@drawable/app_notes"

4android:label="@string/app_name">

5

6<providerclass=".NotePadProvider"

7android:authorities="vider.NotePad"/>

8

54

55</application>

56</manifest>

上述应用程序配置代码中有三个Activity,第9~26行为第一个Activity,第28~42行为第二个Activity,第44~53行为第三个Activity。

上述三个Intent的动作在第一个Activity中都将被解析,即该Activity中可执行这些Intent描述的动作。该Activity中的三个IntentFilter将被解析成下述形式:

{action=android.app.action.MAIN}

{action=android.app.action.MAIN,category=android.app.category.LAUNCHER} 5.2对话框

5.2.1AlertDialog对话框

使用AlertDialog.Builder类创建AlertDialog对话框的步骤为:

(1)创建AlertDialog.Builder对象;

(2)调用AlertDialog.Builder对象的方法setTitle和setMessage添加对话框的标题和提示信息;

(3)调用AlertDialog.Builder对象的方法setView向对话框中添加控件(即设置控件);

(4)调用AlertDialog.Builder对象的方法setPositiveButton、setNeutralButton或setNegativeButton设置显示在对话框下方的左、中和右边的三个按钮。这三个方法都具有两个参数,其一为显示在按钮上的文字,其二为该按钮的监听事件方法;

(5)在setPositiveButton、setNeutralButton或setNegativeButton按钮的监听事件方法中输入需要实现的操作代码;

(6)调用AlertDialog.Builder对象的create方法创建一个AlertDialog对象;

(7)调用AlertDialog对象的show方法显示对话框。

例5.1AlertDialog对话框实例。

新建工程ex05_01,应用名为MyAlertdialogApp,包名为cn.jxufe.zhangenhe,活动界面名为MyAlertdialogAct。向工程中添加myguicolor.xml文件(与工程ex04_08中的同名文件内容相同),添加mystrings_hz.xml文件,定义了两个汉字字符串strnameques和strnameinpt,其内容如下:

1<?xmlversion="1.0"encoding="utf-8"?>

2<resources>

3<stringname="strnameques">你的名字叫什么?</string>

4<stringname="strnameinpt">请输入</string>

5</resources>

工程ex05_01的布局包括两个TextView控件和一个命令按钮控件Button。Button控件显示文字“请输入”,TextView控件tvNameQuestion显示提示文字“你的名字叫什么?”,而另一个TextView控件显示输入的姓名。布局文件main.xml的内容如下所示:

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"

7android:background="@drawable/darkgray"

8>

9<Button

10android:id="@+id/btInputName"

11android:layout_width="150px"

12android:layout_height="wrap_content"

13android:text="@string/strnameinpt"

14android:layout_x="16px"

15android:layout_y="18px"

16android:onClick="myInputName"

17>

18</Button>

19<TextView

20android:id="@+id/tvNameQuestion"

21android:layout_width="180px"

22android:layout_height="30px"

23android:text="@string/strnameques"

24android:layout_x="23px"

25android:layout_y="90px"

26>

27</TextView>

28<TextView

29android:id="@+id/tvNameAnswer"

30android:layout_width="wrap_content"

31android:layout_height="wrap_content"

32android:text=""

33android:layout_x="211px"

34android:layout_y="90px"

35>

36</TextView>

37</AbsoluteLayout>工程ex05_01的执行结果如图5-1所示。图5-1工程ex05_01运行结果程序文件MyAlertdialogAct.java的内容如下所示:

1packagecn.jxufe.zhangenhe;

2

3importandroid.app.Activity;

4importandroid.app.AlertDialog;

5importandroid.app.AlertDialog.Builder;

6importandroid.content.DialogInterface;

7importandroid.os.Bundle;

8importandroid.view.View;

9importandroid.widget.EditText;

10importandroid.widget.TextView;

11

12publicclassMyAlertdialogActextendsActivity{

13 privateTextViewtvName;

14 privateBuilderbldName;

15 privateAlertDialogdlgName;

16 privateEditTextetName;

17/**Calledwhentheactivityisfirstcreated.*/

18@Override

19publicvoidonCreate(BundlesavedInstanceState){

20super.onCreate(savedInstanceState);

21setContentView(R.layout.main);

22myInitGUI();

23}

24privatevoidmyInitGUI(){

25 tvName=(TextView)findViewById(R.id.tvNameAnswer);

26 etName=newEditText(this);

27 bldName=newAlertDialog.Builder(MyAlertdialogAct.this);

28 bldName.setTitle(R.string.strnameinpt);

29 bldName.setMessage(R.string.strnameques);

30 bldName.setView(etName);

31 bldName.setPositiveButton("OK",newDialogInterface.OnClickListener(){

32 @Override

49 MyAlertdialogAct.this.finish();

50 }

51 });

52 dlgName=bldName.create();

53}

54publicvoidmyInputName(Viewv){

55 dlgName.show();

56}

57}使用AlertDialog.Builder类创建和显示对话框是最常用的一种对话框使用方法。第27~52行代码可以写成一条语句,如下所示:

1dlgName=newAlertDialog.Builder(MyAlertdialogAct.this)

2 .setTitle(R.string.strnameinpt)

3 .setMessage(R.string.strnameques)

4 .setView(etName)

5 .setPositiveButton("OK",newDialogInterface.OnClickListener(){

6 @Override

7 publicvoidonClick(DialogInterfacedialog,intwhich){5.2.2自定义对话框

对于具有复杂显示界面的对话框,可借助于布局文件来实现,从而有效地节省创建对话框的代码。若要显示如图5-2所示的对话框,可以使用下面的myfavdialog.xml布局文件。

1<?xmlversion="1.0"encoding="utf-8"?>

2<AbsoluteLayout

3android:id="@+id/myfavdlg"

4android:layout_width="fill_parent"

5android:layout_height="fill_parent"

6xmlns:android="/apk/res/android"

7>

8<TextView

9android:id="@+id/tvfav"

10android:layout_width="wrap_content"

11android:layout_height="wrap_content"

12android:text="@string/strfavsub"

13android:layout_x="17px"

14android:layout_y="12px"

15>

16</TextView>

17<RadioGroup

18android:id="@+id/rgfav"

19android:layout_width="234px"

20android:layout_height="200px"

21android:layout_x="16px"

22android:layout_y="40px"

23>

24<RadioButton

25android:id="@+id/rbchinese"

26android:layout_width="wrap_content"

27android:layout_height="wrap_content"

28android:text="@string/stryw"

29android:checked="true"

30>

31</RadioButton>

32<RadioButton

33android:id="@+id/rbmaths"

34android:layout_width="wrap_content"

35android:layout_height="wrap_content"

36android:text="@string/strsx"

37>

38</RadioButton>

39<RadioButton

40android:id="@+id/rbenglish"

41android:layout_width="wrap_content"

42android:layout_height="wrap_content"

43android:text="@string/stryy"

44>

45</RadioButton>

46</RadioGroup>

47</AbsoluteLayout>

48

上述代码中,第8~16行为一个静态文本框,显示内容为资源“@string/strfavsub”中的字符串“我最喜欢的科目”。第17~46行为RadioGroup控件,其ID号为rgfav,其中有三个单选钮控件,如第24~31行、第32~38行和第39~45行所示,三个单选钮显示的文本依次为“语文”、“数学”和“英语”,如图5-2所示。图5-2对话框界面创建自定义对话框的步骤为:

(1)生成一个布局文件,例如上述的myfavdialog.xml,该布局文件描述了对话框中的所有控件;

(2)将该布局文件实例化,即调用getLayoutInflater方法得到一个LayoutInflater对象,然后,调用该对象的inflate方法将布局文件转化为View对象;

(3)使用AlertDialog.Builder方法创建AlertDialog对话框,指定第(2)步生成的View对象为setView方法的参数,后续的步骤与创建普通的AlertDialog对话框相同。

例5.2

自定义对话框实例。

新建工程ex05_02,应用名为MyDefinedialogApp,包名为cn.jxufe.zhangenhe,活动界面名为MyDefinedialogAct。向工程中添加上述的myfavdialog.xml布局文件,并添加汉字字符串资源文件mystrings_hz.xml,该文件定义了六个字符串常量,其内容如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<resources>

3<stringname="stryw">语文</string>

4<stringname="strsx">数学</string>

5<stringname="stryy">英语</string>

6<stringname="strfavsub">我最喜欢的科目</string>

7<stringname="strsubqus">你最喜欢的科目是什么?</string>

8<stringname="strxz">请选择</string>

9</resources>

活动主界面布局文件main.xml的内容如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<AbsoluteLayout

3android:id="@+id/widget33"

4android:layout_width="fill_parent"

5android:layout_height="fill_parent"

6xmlns:android="/apk/res/android"

7android:background="@drawable/darkgray"

8>

9<TextView

10android:id="@+id/tvHint"

11android:layout_width="wrap_content"

12android:layout_height="wrap_content"

13android:text="@string/strsubqus"

14android:layout_x="20px"

15android:layout_y="40px"

16>

17</TextView>

18<TextView

19android:id="@+id/tvRes"

20android:layout_width="wrap_content"

21android:layout_height="wrap_content"

22android:text=""

23android:layout_x="280px"

24android:layout_y="40px"

25>

26</TextView>

27<Button

28android:id="@+id/btSelect"

29android:layout_width="125px"

30android:layout_height="wrap_content"

31android:text="@string/strxz"

32android:layout_x="30px"

33android:layout_y="90px"

34android:onClick="mySelectMTD"

35>

36</Button>

37</AbsoluteLayout>

工程ex05_02的执行结果如图5-3所示。图5-3工程ex05_02执行结果源程序文件MyDefinedialogAct.java的内容如下所示:

1packagecn.jxufe.zhangenhe;

2

3importandroid.app.Activity;

4importandroid.app.AlertDialog;

5importandroid.app.AlertDialog.Builder;

6importandroid.content.DialogInterface;

7importandroid.os.Bundle;

8importandroid.view.LayoutInflater;

9importandroid.view.View;

10importandroid.view.ViewGroup;

11importandroid.widget.RadioButton;

12importandroid.widget.RadioGroup;

13importandroid.widget.TextView;

14

15publicclassMyDefinedialogActextendsActivity{

16 privateLayoutInflaterfact;

17 privateViewview;

18 privateBuilderbuilder;

19 privateAlertDialogdlg;

20 privateTextViewtvres;

21 privateRadioGrouprgsel;

22/**Calledwhentheactivityisfirstcreated.*/

23@Override

24publicvoidonCreate(BundlesavedInstanceState){

25super.onCreate(savedInstanceState);

26setContentView(R.layout.main);

27myInitGUI();

28}

29privatevoidmyInitGUI(){

30 tvres=(TextView)findViewById(R.id.tvRes);

31 fact=getLayoutInflater();

32 view=fact.inflate(R.layout.myfavdialog,

33 (ViewGroup)findViewById(R.id.myfavdlg));

34 builder=newAlertDialog.Builder(MyDefinedialogAct.this);

35 builder.setTitle(R.string.strxz);

36 builder.setView(view);

37 builder.setPositiveButton("OK",newDialogInterface.OnClickListener(){

38 @Override

39 publicvoidonClick(DialogInterfacedialog,intwhich){

40 //TODOAuto-generatedmethodstub

41 rgsel=(RadioGroup)view.findViewById(R.id.rgfav);

42 tvres.setText(((RadioButton)view.findViewById(

43 rgsel.getCheckedRadioButtonId())).getText());

44 }

45 });

46 builder.setNegativeButton("Cancel",newDialogInterface.OnClickListener(){

47 @Override

48 publicvoidonClick(DialogInterfacedialog,intwhich){

49 //TODOAuto-generatedmethodstub

50 dialog.cancel();

51 }

52 });

53 dlg=builder.create();

54}

55publicvoidmySelectMTD(Viewv){

56 dlg.show();

57}

58}5.2.3Dialog类

使用Android的Dialog类创建对话框的方法与Java语言标准对话框创建方法类似。对于Android应用程序而言,首先要设计对话框的布局。例如,要创建如图5-4所示对话框,其布局文件mycdialog.xml如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<AbsoluteLayout

3android:id="@+id/abslaydlg"

4android:layout_width="310px"

5android:layout_height="300px"

6xmlns:android="/apk/res/android"图5-4对话框

7android:background="@drawable/darkgray"

8>

9<CheckBox

10android:id="@+id/cbwq"

11android:layout_width="200px"

12android:layout_height="40px"

13android:text="@string/strwq"

14android:layout_x="30px"

15android:layout_y="10px"

16>

17</CheckBox>

18<CheckBox

19android:id="@+id/cbgq"

20android:layout_width="200px"

21android:layout_height="40px"

22android:text="@string/strgq"

23android:layout_x="30px"

24android:layout_y="60px"

25>

26</CheckBox>

27<CheckBox

28android:id="@+id/cbsf"

29android:layout_width="200px"

30android:layout_height="40px"

31android:text="@string/strsf"

32android:layout_x="30px"

33android:layout_y="110px"

34>

35

</CheckBox>

36<CheckBox

37android:id="@+id/cbms"

38android:layout_width="200px"

39android:layout_height="40px"

40android:text="@string/strms"

41android:layout_x="30px"

42android:layout_y="160px"

43>

44</CheckBox>

45<Button

46android:id="@+id/btOK"

47android:layout_width="120px"

48android:layout_height="60px"

49android:text="@string/strok"

50android:layout_x="20px"

51android:layout_y="220px"

52>

53</Button>

54<Button

55android:id="@+id/btCancel"

56android:layout_width="120px"

57android:layout_height="60px"

58android:text="@string/strcancel"

59android:layout_x="170px"

60android:layout_y="220px"

61>

62</Button>

63</AbsoluteLayout>

例5.3Dialog类对话框实例。

新建工程ex05_03,应用名为MyCDialogApp,包名为cn.jxufe.zhangenhe,活动界面名为MyCDialogAct。工程ex05_03包括程序文件MyCDialogAct.java、对话框布局文件mycdialog.xml、主窗口布局文件main.xml、汉字字符串资源文件mystrings_hz.xml和颜色资源文件myguicolor.xml等。其中,myguicolor.xml文件与工程ex05_02中的同名文件相同,mystrings_hz.xml定义了9个汉字字符串,如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<resources>

3<stringname="strwq">围棋</string>

4<stringname="strgq">钢琴</string>

5<stringname="strsf">书法</string>

6<stringname="strms">美术</string>

7<stringname="strmyent">我的业余爱好</string>

8<stringname="stryrent">你的业余爱好是什么?</string>

9<stringname="strqxz">请选择</string>

10<stringname="strok">确定</string>

11<stringname="strcancel">取消</string>

12</resources>主窗口布局文件main.xml包含两个TextView控件和一个命令按钮控件,其内容如下所示:

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"

7android:background="@drawable/darkgray"

8>

9<TextView

10android:id="@+id/tvHint"

11android:layout_width="220px"

12android:layout_height="40px"

13android:text="@string/stryrent"

14android:layout_x="10px"

15android:layout_y="40px"

16>

17</TextView>

18<TextView

19android:id="@+id/tvRes"

20android:layout_width="220px"

21android:layout_height="40px"

22android:text=""

23android:layout_x="230px"

24android:layout_y="40px"

25>

26</TextView>

27<Button

28android:id="@+id/btSel"

29android:layout_width="120px"

30android:layout_height="60px"

31android:text="@string/strqxz"

32android:layout_x="20px"

33android:layout_y="90px"

34android:onClick="myOpenDlgMTD"

35>

36</Button>

37</AbsoluteLayout>

上述代码中第2~8行与第37行配对,说明这是一个绝对布局,其中第9~26行为两个TextView控件,第27~36行为一个Button控件。布局文件中指明了各个控件的ID号、宽度、高度、显示文本和显示位置等信息,Button控件的点击事件方法为“myOpenDlgMTD”。

工程ex05_03的执行结果如图5-5所示。图5-5工程ex05_03执行结果程序文件MyCDialogAct.java的代码如下所示:

1packagecn.jxufe.zhangenhe;

2

3importandroid.app.Activity;

4importandroid.app.Dialog;

5importandroid.content.Context;

6importandroid.os.Bundle;

7importandroid.view.View;

8importandroid.widget.Button;

9importandroid.widget.CheckBox;

10importandroid.widget.TextView;

11

12publicclassMyCDialogActextendsActivity{

13 privateTextViewtvres;

14/**Calledwhentheactivityisfirstcreated.*/

15@Override

16publicvoidonCreate(BundlesavedInstanceState){

17super.onCreate(savedInstanceState);

18setContentView(R.layout.main);

19myInitGUI();

20}程序启动后首先调用第16行的onCreate方法,执行第18行设置显示如图5-5(a)所示界面,然后调用myInitGUI方法即第21~23行代码得到静态文本框对象tvres。

21privatevoidmyInitGUI(){

22 tvres=(TextView)findViewById(R.id.tvRes);

23}

24publicvoidmyOpenDlgMTD(Viewv){

25 MyCDialogmydlg=newMyCDialog(MyCDialogAct.this);

26 mydlg.show();

27}下面的第28行说明类MyCDialog继承了类Dialog,同时第28~75行位于类MyCDialogAct的内部,表示类MyCDialog是类MyCDialogAct的私有内部类。

28privateclassMyCDialogextendsDialog{

29 privateButtonbtok,btcancel;

30 privateCheckBoxcbwq,cbgq,cbsf,cbms;

31 privateString[]strah={"围棋","钢琴","书法","美术"};

32 publicMyCDialog(Contextcontext){

33 super(context);

34 //TODOAuto-generatedconstructorstub

35 MyCDialog.this.setTitle(R.string.strqxz);

36 }第34行代码为指定对话框的标题为资源字符串R.string.strqxz,即“请选择”。

37 @Override

38 protectedvoidonCreate(BundlesavedInstanceState){

39 super.onCreate(savedInstanceState);

40 setContentView(R.layout.mycdialog);

41 myInitDlg();

42 }

对话框启动时将首先调用onCreate方法,该方法第40行调用setContentView设置对话框界面如图5-4所示,第41行调用方法myInitDlg进行对话框初始化。

43 privatevoidmyInitDlg(){

44 btok=(Button)findViewById(R.id.btOK);

45 btcancel=(Button)findViewById(R.id.btCancel);

46 cbwq=(CheckBox)findViewById(R.id.cbwq);

47 cbgq=(CheckBox)findViewById(R.id.cbgq);

48 cbsf=(CheckBox)findViewById(R.id.cbsf);

49 cbms=(CheckBox)findViewById(R.id.cbms);上述第44~49行调用方法findViewById分别获得对话框中两个Button控件和四个CheckBox控件的对象。下面第50~73行设置两个Button控件的事件监听方法。

50 btok.setOnClickListener(newView.OnClickListener(){

51 @Override

52 publicvoidonClick(Viewv){

53 //TODOAuto-generatedmethodstub

54 Stringstrv="";

55 if(cbwq.isChecked())

56 strv=strv+strah[0];

57 if(cbgq.isChecked())

58 strv=strv+strah[1];

59 if(cbsf.isChecked())

60 strv=strv+strah[2];

61 if(cbms.isChecked())

62 strv=strv+strah[3];

63 tvres.setText(strv);

64 MyCDialog.this.dismiss();

65 }

66 });当点击图5-5(b)中的“确定”按钮时将执行第50~66行的代码。第55~62行依次判断各个CheckBox控件是否选中,如果选中,则将其对应的文本添加到字符串strv中。第63行将字符串strv显示在活动界面的TextView控件中,第64行关闭对话框。

67 btcancel.setOnClickListener(newView.OnClickListener(){

68 @Override

69 publicvoidonClick(Viewv){

70 //TODOAuto-generatedmethodstub

71 MyCDialog.this.cancel();

72 }

73 });

74 }

75}

76}

当点击图5-5(b)中的“取消”按钮时,执行第67~73行代码,即关闭对话框(第71行)。

使用工程ex05_03所示的方法创建对话框和创建普通的活动界面的过程相似。因此,与其他两种创建对话框的方法相比,这种创建方法最直观。5.2.4ProgressDialog对话框

例5.4

进度条对话框实例。

新建工程ex05_04,其执行结果如图5-6所示,应用名为MyProgressDlgApp,包名为cn.jxufe.zhangenhe,活动界面名为MyProgressDlgAct。工程ex05_04包括程序文件MyProgressDlgAct.java、汉字字符串资源文件mystrings_hz.xml、主界面布局文件main.xml和颜色资源文件myguicolor.xml等。

由图5-6(a)可知,主界面布局文件main.xml中只有一个命令按钮,显示文本为“弹出进度条对话框”,其事件处理方法为myOpenPDlgMTD。资源文件myguicolor.xml与工程ex05_03中的同名文件相同,mystrings_hz.xml文件中定义了三个汉字字符串常量,如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<resources>

3<stringname="stropen">弹出进度条对话框</string>

4<stringname="strcap">进度条对话框</string>

5<stringname="strprg">进度条动态演示</string>

6</resources>图5-6进度条对话框实例显示结果在图5-6(a)中点击“弹出进度条对话框”按钮,将弹出如图5-6(b)所示的进度条对话框。这里使用一个线程和延时方法控制进度条的进度,程序文件MyProgressDlgAct.java的代码如下所示:

1packagecn.jxufe.zhangenhe;

2

3importandroid.app.Activity;

4importandroid.app.ProgressDialog;

5importandroid.content.DialogInterface;

6importandroid.os.Bundle;

7importandroid.os.Handler;

8importandroid.os.Message;

9importandroid.util.Log;

10importandroid.view.View;

11

12publicclassMyProgressDlgActextendsActivity{

13privateProgressDialogprgdlg;

14privateMyProgressThreadmyprgthd;

15privatefinalbooleanRUNNING=true;

16privatefinalbooleanSTOPPING=false;

第13~14行定义了进度条对话框对象prgdlg和自定义类MyProgressThread的对象myprgthd;第15~16行定义两个布尔常量RUNNING和STOPPING,其值分别为真和假。自定义类MyProgressThread继承线程类Thread,是类MyProgressDlgAct的内部类,如第57行所示。

17 /**Calledwhentheactivityisfirstcreated.*/

18@Override

19publicvoidonCreate(BundlesavedInstanceState){

20super.onCreate(savedInstanceState);

21setContentView(R.layout.main);

22myInitGUI();

23}

24privatevoidmyInitGUI(){

25 prgdlg=newProgressDialog(MyProgressDlgAct.this);

26 prgdlg.setTitle(R.string.strcap);

27 prgdlg.setMessage(getString(R.string.strprg));

28 prgdlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

29 prgdlg.setMax(1000);

30 prgdlg.setIndeterminate(false);

31 prgdlg.setButton("OK",newDialogInterface.OnClickListener(){

32 @Override

33 publicvoidonClick(DialogInterfacedialog,intwhich){

34 //TODOAuto-generatedmethodstub

35 myprgthd.setState(STOPPING);

36 dialog.cancel();

37 }

38 });

39}

在Android中启动一个线程后,程序员或用户无法停止或删除它,这里所谓的“停止线程”只是让线程不去执行特定的代码而永远处于休眠态,Android系统会自动清除那些无用的线程。

40publicvoidmyOpenPDlgMTD(Viewv){

41 myprgthd=newMyProgressThread(handler);

42 myprgthd.setState(RUNNING);

43 myprgthd.start();//Itcannotbestopped

44 prgdlg.show();

45}第40~45行为图5-6(a)中按钮“弹出进度条对话框”的点击事件。第41行为开辟一个新的线程,第42行设置该线程对象的私有数据state(第60行)为RUNNING即true,允许第69~83行无限循环,直到state变量被设置为STOPPING即false。然后,第43行调用start方法启动该线程对象,第44行显示进度条对话框prgdlg。注意,每点击图5-6(a)中的按钮一次,第40~45行就会执行一次,就会创建一个新的线程,因此该应用程序在执行时会创建多个线程,Android系统会帮助程序员或用户撤消无用的线程。

46finalHandlerhandler=newHandler(){

47 @Override

48publicvoidhandleMessage(Messagemsg){

49intcurv=msg.getData().getInt("value");

50prgdlg.setProgress(curv);

51if(curv>=1000){

52myprgthd.setState(STOPPING);

53prgdlg.dismiss();

54}

55}

56};第46~56行创建一个Handler类对象handler,访问对象用于管理和接收Message类型的消息。第49行接收来自线程发送的消息(第81行),getData方法可获得Bundle类型的任意数据,每个数据由一个键值对应,这里getInt方法获得键值为value的整型数值,与第78~80行对应。第50行调用setProgress方法设置进度条的当前值为curv;第51~54行判断curv的值是否大于1000(进度条的长度),如果大于1000,则“停止线程”,然后关闭对话框。

57privateclassMyProgressThreadextendsThread{

58privateHandlerh;

59privateMessagemsg;

60privatebooleanstate;

61privateintval;

62MyProgressThread(Handlerh){

63this.h=h;

64val=0;

65}

66@Override

67publicvoidrun(){

68 Log.i("MyDebug","Iamrunning.");

69 while(sta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论