版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流倉(cāng)儲(chǔ)工程課程設(shè)計(jì)
- 愛(ài)護(hù)地球環(huán)境 課程設(shè)計(jì)
- 混凝土路面工程課程設(shè)計(jì)
- 系統(tǒng)移植課程設(shè)計(jì)
- 2024年甘肅省安全員-C證(專職安全員)考試題庫(kù)
- 智能澆花器課程設(shè)計(jì)
- 2024重慶市建筑安全員考試題庫(kù)附答案
- 2025河南省安全員C證(專職安全員)考試題庫(kù)
- 組合梁課程設(shè)計(jì)的 s as
- 2025陜西省建筑安全員B證考試題庫(kù)及答案
- python實(shí)現(xiàn)魔獸世界自動(dòng)釣魚(yú)輔助工具(附源碼)
- 軟件系統(tǒng)日常運(yùn)維服務(wù)方案
- GB/T 11017.2-2024額定電壓66 kV(Um=72.5 kV)和110 kV(Um=126 kV)交聯(lián)聚乙烯絕緣電力電纜及其附件第2部分:電纜
- DB11∕T 243-2014 戶外廣告設(shè)施技術(shù)規(guī)范
- 飛灰二惡英類低溫催化分解污染控制技術(shù)規(guī)范-編制說(shuō)明(征求意見(jiàn)稿)
- 會(huì)計(jì)憑證附件管理制度范文
- GB/T 44462.1-2024工業(yè)互聯(lián)網(wǎng)企業(yè)網(wǎng)絡(luò)安全第1部分:應(yīng)用工業(yè)互聯(lián)網(wǎng)的工業(yè)企業(yè)防護(hù)要求
- 保潔突發(fā)事件應(yīng)急預(yù)案
- 三農(nóng)領(lǐng)域法律法規(guī)解讀手冊(cè)
- 【人教版】《勞動(dòng)教育》三下 勞動(dòng)項(xiàng)目六 清理電冰箱 課件
- 全球半導(dǎo)體制造類eda行業(yè)發(fā)展白皮書(shū)-沙利文-2024120
評(píng)論
0/150
提交評(píng)論