《Google Android開(kāi)發(fā)技術(shù)》課件第5章_第1頁(yè)
《Google Android開(kāi)發(fā)技術(shù)》課件第5章_第2頁(yè)
《Google Android開(kāi)發(fā)技術(shù)》課件第5章_第3頁(yè)
《Google Android開(kāi)發(fā)技術(shù)》課件第5章_第4頁(yè)
《Google Android開(kāi)發(fā)技術(shù)》課件第5章_第5頁(yè)
已閱讀5頁(yè),還剩199頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章Android多用戶界面程序設(shè)計(jì)5.1Intent的概念

5.2對(duì)話框

5.3菜單

5.4多用戶界面設(shè)計(jì)

5.5小結(jié)

5.1Intent的概念

Intent(譯為意圖)提供了不同Activity(活動(dòng)界面)間數(shù)據(jù)交換的方法,被視為Activity之間的紐帶,它所傳遞的信息主要是動(dòng)作(Action)和數(shù)據(jù)(data),即要執(zhí)行的動(dòng)作和要操作的數(shù)據(jù)。動(dòng)作使用Android系統(tǒng)預(yù)定義的常量表示,例如ACTION_MAIN、ACTION_VIEW和ACTION_EDIT等;數(shù)據(jù)使用URI(統(tǒng)一資源標(biāo)識(shí)符)表示。借助Intent對(duì)象,調(diào)用方法startActivity可啟動(dòng)一個(gè)新的界面;調(diào)用方法startService或bindService可與服務(wù)(沒(méi)有用戶界面的應(yīng)用程序)通信;調(diào)用方法sendBroadcast與所有廣播接收器通信。此外,Intent

還具有category(分類)、type(類型)、component(組件)和extras(附加信息)等屬性。其中,category為動(dòng)作提供分類信息;type用于顯式指定MIME(多用途網(wǎng)絡(luò)郵件擴(kuò)展)類型;component顯式指定Intent使用的組件類;extras是一個(gè)Bundle對(duì)象,包括附加的數(shù)據(jù)信息。

有兩種使用Intent的方法即顯式使用和隱式使用。顯式Intent通過(guò)調(diào)用方法setClass或setComponent運(yùn)行一個(gè)指定的類,這是應(yīng)用程序裝入新的活動(dòng)界面(Activity)時(shí)常用的方法。隱式Intent不指定特定的組件或類,由Android系統(tǒng)尋找與該Intent描述的動(dòng)作和數(shù)據(jù)匹配的組件執(zhí)行,這一種過(guò)程稱為Intent解析機(jī)制。Intent解析器將Intent映射到一個(gè)匹配的Activity、廣播接收器(BroadcastReceiver)或服務(wù)(Service)。Intent解析器根據(jù)應(yīng)用程序的AndroidManifest.xml文件中IntentFilter包含的動(dòng)作(action)、類型(type)或分類(category)等信息,決定Intent信息傳遞的對(duì)象。為了介紹隱式Intent的使用方法,下面以“記事本”應(yīng)用程序的AndroidManifest.xml為例說(shuō)明,該文件內(nèi)容如下所示:

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>

上述應(yīng)用程序配置代碼中有三個(gè)Activity,第9~26行為第一個(gè)Activity,第28~42行為第二個(gè)Activity,第44~53行為第三個(gè)Activity。

上述三個(gè)Intent的動(dòng)作在第一個(gè)Activity中都將被解析,即該Activity中可執(zhí)行這些Intent描述的動(dòng)作。該Activity中的三個(gè)IntentFilter將被解析成下述形式:

{action=android.app.action.MAIN}

{action=android.app.action.MAIN,category=android.app.category.LAUNCHER} 5.2對(duì)話框

5.2.1AlertDialog對(duì)話框

使用AlertDialog.Builder類創(chuàng)建AlertDialog對(duì)話框的步驟為:

(1)創(chuàng)建AlertDialog.Builder對(duì)象;

(2)調(diào)用AlertDialog.Builder對(duì)象的方法setTitle和setMessage添加對(duì)話框的標(biāo)題和提示信息;

(3)調(diào)用AlertDialog.Builder對(duì)象的方法setView向?qū)υ捒蛑刑砑涌丶?即設(shè)置控件);

(4)調(diào)用AlertDialog.Builder對(duì)象的方法setPositiveButton、setNeutralButton或setNegativeButton設(shè)置顯示在對(duì)話框下方的左、中和右邊的三個(gè)按鈕。這三個(gè)方法都具有兩個(gè)參數(shù),其一為顯示在按鈕上的文字,其二為該按鈕的監(jiān)聽(tīng)事件方法;

(5)在setPositiveButton、setNeutralButton或setNegativeButton按鈕的監(jiān)聽(tīng)事件方法中輸入需要實(shí)現(xiàn)的操作代碼;

(6)調(diào)用AlertDialog.Builder對(duì)象的create方法創(chuàng)建一個(gè)AlertDialog對(duì)象;

(7)調(diào)用AlertDialog對(duì)象的show方法顯示對(duì)話框。

例5.1AlertDialog對(duì)話框?qū)嵗?/p>

新建工程ex05_01,應(yīng)用名為MyAlertdialogApp,包名為cn.jxufe.zhangenhe,活動(dòng)界面名為MyAlertdialogAct。向工程中添加myguicolor.xml文件(與工程ex04_08中的同名文件內(nèi)容相同),添加mystrings_hz.xml文件,定義了兩個(gè)漢字字符串strnameques和strnameinpt,其內(nèi)容如下:

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

2<resources>

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

4<stringname="strnameinpt">請(qǐng)輸入</string>

5</resources>

工程ex05_01的布局包括兩個(gè)TextView控件和一個(gè)命令按鈕控件Button。Button控件顯示文字“請(qǐng)輸入”,TextView控件tvNameQuestion顯示提示文字“你的名字叫什么?”,而另一個(gè)TextView控件顯示輸入的姓名。布局文件main.xml的內(nèi)容如下所示:

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的執(zhí)行結(jié)果如圖5-1所示。圖5-1工程ex05_01運(yùn)行結(jié)果程序文件MyAlertdialogAct.java的內(nèi)容如下所示:

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類創(chuàng)建和顯示對(duì)話框是最常用的一種對(duì)話框使用方法。第27~52行代碼可以寫(xiě)成一條語(yǔ)句,如下所示:

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自定義對(duì)話框

對(duì)于具有復(fù)雜顯示界面的對(duì)話框,可借助于布局文件來(lái)實(shí)現(xiàn),從而有效地節(jié)省創(chuàng)建對(duì)話框的代碼。若要顯示如圖5-2所示的對(duì)話框,可以使用下面的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行為一個(gè)靜態(tài)文本框,顯示內(nèi)容為資源“@string/strfavsub”中的字符串“我最喜歡的科目”。第17~46行為RadioGroup控件,其ID號(hào)為rgfav,其中有三個(gè)單選鈕控件,如第24~31行、第32~38行和第39~45行所示,三個(gè)單選鈕顯示的文本依次為“語(yǔ)文”、“數(shù)學(xué)”和“英語(yǔ)”,如圖5-2所示。圖5-2對(duì)話框界面創(chuàng)建自定義對(duì)話框的步驟為:

(1)生成一個(gè)布局文件,例如上述的myfavdialog.xml,該布局文件描述了對(duì)話框中的所有控件;

(2)將該布局文件實(shí)例化,即調(diào)用getLayoutInflater方法得到一個(gè)LayoutInflater對(duì)象,然后,調(diào)用該對(duì)象的inflate方法將布局文件轉(zhuǎn)化為View對(duì)象;

(3)使用AlertDialog.Builder方法創(chuàng)建AlertDialog對(duì)話框,指定第(2)步生成的View對(duì)象為setView方法的參數(shù),后續(xù)的步驟與創(chuàng)建普通的AlertDialog對(duì)話框相同。

例5.2

自定義對(duì)話框?qū)嵗?/p>

新建工程ex05_02,應(yīng)用名為MyDefinedialogApp,包名為cn.jxufe.zhangenhe,活動(dòng)界面名為MyDefinedialogAct。向工程中添加上述的myfavdialog.xml布局文件,并添加漢字字符串資源文件mystrings_hz.xml,該文件定義了六個(gè)字符串常量,其內(nèi)容如下所示:

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

2<resources>

3<stringname="stryw">語(yǔ)文</string>

4<stringname="strsx">數(shù)學(xué)</string>

5<stringname="stryy">英語(yǔ)</string>

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

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

8<stringname="strxz">請(qǐng)選擇</string>

9</resources>

活動(dòng)主界面布局文件main.xml的內(nèi)容如下所示:

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的執(zhí)行結(jié)果如圖5-3所示。圖5-3工程ex05_02執(zhí)行結(jié)果源程序文件MyDefinedialogAct.java的內(nèi)容如下所示:

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類創(chuàng)建對(duì)話框的方法與Java語(yǔ)言標(biāo)準(zhǔn)對(duì)話框創(chuàng)建方法類似。對(duì)于Android應(yīng)用程序而言,首先要設(shè)計(jì)對(duì)話框的布局。例如,要?jiǎng)?chuàng)建如圖5-4所示對(duì)話框,其布局文件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對(duì)話框

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類對(duì)話框?qū)嵗?/p>

新建工程ex05_03,應(yīng)用名為MyCDialogApp,包名為cn.jxufe.zhangenhe,活動(dòng)界面名為MyCDialogAct。工程ex05_03包括程序文件MyCDialogAct.java、對(duì)話框布局文件mycdialog.xml、主窗口布局文件main.xml、漢字字符串資源文件mystrings_hz.xml和顏色資源文件myguicolor.xml等。其中,myguicolor.xml文件與工程ex05_02中的同名文件相同,mystrings_hz.xml定義了9個(gè)漢字字符串,如下所示:

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

2<resources>

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

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

5<stringname="strsf">書(shū)法</string>

6<stringname="strms">美術(shù)</string>

7<stringname="strmyent">我的業(yè)余愛(ài)好</string>

8<stringname="stryrent">你的業(yè)余愛(ài)好是什么?</string>

9<stringname="strqxz">請(qǐng)選擇</string>

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

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

12</resources>主窗口布局文件main.xml包含兩個(gè)TextView控件和一個(gè)命令按鈕控件,其內(nèi)容如下所示:

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行配對(duì),說(shuō)明這是一個(gè)絕對(duì)布局,其中第9~26行為兩個(gè)TextView控件,第27~36行為一個(gè)Button控件。布局文件中指明了各個(gè)控件的ID號(hào)、寬度、高度、顯示文本和顯示位置等信息,Button控件的點(diǎn)擊事件方法為“myOpenDlgMTD”。

工程ex05_03的執(zhí)行結(jié)果如圖5-5所示。圖5-5工程ex05_03執(zhí)行結(jié)果程序文件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}程序啟動(dòng)后首先調(diào)用第16行的onCreate方法,執(zhí)行第18行設(shè)置顯示如圖5-5(a)所示界面,然后調(diào)用myInitGUI方法即第21~23行代碼得到靜態(tài)文本框?qū)ο髏vres。

21privatevoidmyInitGUI(){

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

23}

24publicvoidmyOpenDlgMTD(Viewv){

25 MyCDialogmydlg=newMyCDialog(MyCDialogAct.this);

26 mydlg.show();

27}下面的第28行說(shuō)明類MyCDialog繼承了類Dialog,同時(shí)第28~75行位于類MyCDialogAct的內(nèi)部,表示類MyCDialog是類MyCDialogAct的私有內(nèi)部類。

28privateclassMyCDialogextendsDialog{

29 privateButtonbtok,btcancel;

30 privateCheckBoxcbwq,cbgq,cbsf,cbms;

31 privateString[]strah={"圍棋","鋼琴","書(shū)法","美術(shù)"};

32 publicMyCDialog(Contextcontext){

33 super(context);

34 //TODOAuto-generatedconstructorstub

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

36 }第34行代碼為指定對(duì)話框的標(biāo)題為資源字符串R.string.strqxz,即“請(qǐng)選擇”。

37 @Override

38 protectedvoidonCreate(BundlesavedInstanceState){

39 super.onCreate(savedInstanceState);

40 setContentView(R.layout.mycdialog);

41 myInitDlg();

42 }

對(duì)話框啟動(dòng)時(shí)將首先調(diào)用onCreate方法,該方法第40行調(diào)用setContentView設(shè)置對(duì)話框界面如圖5-4所示,第41行調(diào)用方法myInitDlg進(jìn)行對(duì)話框初始化。

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行調(diào)用方法findViewById分別獲得對(duì)話框中兩個(gè)Button控件和四個(gè)CheckBox控件的對(duì)象。下面第50~73行設(shè)置兩個(gè)Button控件的事件監(jiān)聽(tīng)方法。

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 });當(dāng)點(diǎn)擊圖5-5(b)中的“確定”按鈕時(shí)將執(zhí)行第50~66行的代碼。第55~62行依次判斷各個(gè)CheckBox控件是否選中,如果選中,則將其對(duì)應(yīng)的文本添加到字符串strv中。第63行將字符串strv顯示在活動(dòng)界面的TextView控件中,第64行關(guān)閉對(duì)話框。

67 btcancel.setOnClickListener(newView.OnClickListener(){

68 @Override

69 publicvoidonClick(Viewv){

70 //TODOAuto-generatedmethodstub

71 MyCDialog.this.cancel();

72 }

73 });

74 }

75}

76}

當(dāng)點(diǎn)擊圖5-5(b)中的“取消”按鈕時(shí),執(zhí)行第67~73行代碼,即關(guān)閉對(duì)話框(第71行)。

使用工程ex05_03所示的方法創(chuàng)建對(duì)話框和創(chuàng)建普通的活動(dòng)界面的過(guò)程相似。因此,與其他兩種創(chuàng)建對(duì)話框的方法相比,這種創(chuàng)建方法最直觀。5.2.4ProgressDialog對(duì)話框

例5.4

進(jìn)度條對(duì)話框?qū)嵗?/p>

新建工程ex05_04,其執(zhí)行結(jié)果如圖5-6所示,應(yīng)用名為MyProgressDlgApp,包名為cn.jxufe.zhangenhe,活動(dòng)界面名為MyProgressDlgAct。工程ex05_04包括程序文件MyProgressDlgAct.java、漢字字符串資源文件mystrings_hz.xml、主界面布局文件main.xml和顏色資源文件myguicolor.xml等。

由圖5-6(a)可知,主界面布局文件main.xml中只有一個(gè)命令按鈕,顯示文本為“彈出進(jìn)度條對(duì)話框”,其事件處理方法為myOpenPDlgMTD。資源文件myguicolor.xml與工程ex05_03中的同名文件相同,mystrings_hz.xml文件中定義了三個(gè)漢字字符串常量,如下所示:

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

2<resources>

3<stringname="stropen">彈出進(jìn)度條對(duì)話框</string>

4<stringname="strcap">進(jìn)度條對(duì)話框</string>

5<stringname="strprg">進(jìn)度條動(dòng)態(tài)演示</string>

6</resources>圖5-6進(jìn)度條對(duì)話框?qū)嵗@示結(jié)果在圖5-6(a)中點(diǎn)擊“彈出進(jìn)度條對(duì)話框”按鈕,將彈出如圖5-6(b)所示的進(jìn)度條對(duì)話框。這里使用一個(gè)線程和延時(shí)方法控制進(jìn)度條的進(jìn)度,程序文件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行定義了進(jìn)度條對(duì)話框?qū)ο髉rgdlg和自定義類MyProgressThread的對(duì)象myprgthd;第15~16行定義兩個(gè)布爾常量RUNNING和STOPPING,其值分別為真和假。自定義類MyProgressThread繼承線程類Thread,是類MyProgressDlgAct的內(nèi)部類,如第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中啟動(dòng)一個(gè)線程后,程序員或用戶無(wú)法停止或刪除它,這里所謂的“停止線程”只是讓線程不去執(zhí)行特定的代碼而永遠(yuǎn)處于休眠態(tài),Android系統(tǒng)會(huì)自動(dòng)清除那些無(wú)用的線程。

40publicvoidmyOpenPDlgMTD(Viewv){

41 myprgthd=newMyProgressThread(handler);

42 myprgthd.setState(RUNNING);

43 myprgthd.start();//Itcannotbestopped

44 prgdlg.show();

45}第40~45行為圖5-6(a)中按鈕“彈出進(jìn)度條對(duì)話框”的點(diǎn)擊事件。第41行為開(kāi)辟一個(gè)新的線程,第42行設(shè)置該線程對(duì)象的私有數(shù)據(jù)state(第60行)為RUNNING即true,允許第69~83行無(wú)限循環(huán),直到state變量被設(shè)置為STOPPING即false。然后,第43行調(diào)用start方法啟動(dòng)該線程對(duì)象,第44行顯示進(jìn)度條對(duì)話框prgdlg。注意,每點(diǎn)擊圖5-6(a)中的按鈕一次,第40~45行就會(huì)執(zhí)行一次,就會(huì)創(chuàng)建一個(gè)新的線程,因此該應(yīng)用程序在執(zhí)行時(shí)會(huì)創(chuàng)建多個(gè)線程,Android系統(tǒng)會(huì)幫助程序員或用戶撤消無(wú)用的線程。

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行創(chuàng)建一個(gè)Handler類對(duì)象handler,訪問(wèn)對(duì)象用于管理和接收Message類型的消息。第49行接收來(lái)自線程發(fā)送的消息(第81行),getData方法可獲得Bundle類型的任意數(shù)據(jù),每個(gè)數(shù)據(jù)由一個(gè)鍵值對(duì)應(yīng),這里getInt方法獲得鍵值為value的整型數(shù)值,與第78~80行對(duì)應(yīng)。第50行調(diào)用setProgress方法設(shè)置進(jìn)度條的當(dāng)前值為curv;第51~54行判斷curv的值是否大于1000(進(jìn)度條的長(zhǎng)度),如果大于1000,則“停止線程”,然后關(guān)閉對(duì)話框。

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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論