Android的圖形用戶界面_第1頁
Android的圖形用戶界面_第2頁
Android的圖形用戶界面_第3頁
Android的圖形用戶界面_第4頁
Android的圖形用戶界面_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

課程:軟件建模技術(shù)《Android應(yīng)用程序設(shè)計(jì)》

第4章Android的圖形用戶界面 授課教師: 黃錫波 授課時間: 第7周〔2016-4-11〕第5/6節(jié),〔4-14〕第1/2/3/4節(jié) 第8周〔2016-4-18〕第5/6節(jié),〔4-21〕第1/2/3/4節(jié) 授課班級: 14軟件技術(shù)1班/45人 授課地點(diǎn): 教學(xué)樓C401機(jī)房提綱4.1工程導(dǎo)引 4.2工程分析 4.3技術(shù)準(zhǔn)備 4.3.1知識點(diǎn)1:ListView 4.3.2知識點(diǎn)2:對話框(Dialog)4.3.3知識點(diǎn)3: 進(jìn)度條(ProgressBar) 4.3.4知識點(diǎn)4: 菜單 提綱4.4工程實(shí)施 4.5技術(shù)拓展 4.6本章小結(jié) 4.7強(qiáng)化練習(xí) 44.1工程導(dǎo)引前面一章我們學(xué)習(xí)了Android根本控件的使用,并且能夠結(jié)合布局的知識創(chuàng)立一個具有良好用戶體驗(yàn)風(fēng)格的界面。但是,僅僅只有這些是遠(yuǎn)遠(yuǎn)不夠的。當(dāng)我們需要與后臺進(jìn)行訪問以及數(shù)據(jù)加載時進(jìn)度條又該如何實(shí)現(xiàn)呢?當(dāng)用戶的操作有問題需要給用戶進(jìn)行提示或者警告時又該如何操作呢?上面的這些問題都是這一章我們需要學(xué)習(xí)和掌握的。4.2工程分析為了能夠讓我們的軟件具有更好的用戶體驗(yàn),Android提供了在PC上經(jīng)常見到和使用的對話框,通過對話框讓用戶與軟件進(jìn)行交流;為了防止讓用戶在使用軟件以及在軟件加載數(shù)據(jù)時不知所措,Android為我們提供了進(jìn)度條,讓用戶知道我們的軟件是在運(yùn)轉(zhuǎn)的,如圖4-1所示。圖4-1對話框與進(jìn)度條4.2工程分析在工程開發(fā)中經(jīng)常會遇到列表,那么我們的Android有沒有列表的控件呢?答案是肯定的。Android不僅僅為開發(fā)者提供了列表,同樣為開發(fā)者提供了“菜單”讓我們使用。本章就從上面所講的知識入手,帶著大家進(jìn)一步學(xué)習(xí)Android的根底知識。4.3技術(shù)準(zhǔn)備4.3.1知識點(diǎn)1:ListView在Android中,ListView是比較常用的控件,它以列表的形式展示具體內(nèi)容,并且能夠根據(jù)數(shù)據(jù)的長度自動適應(yīng)地顯示。用戶可以選擇并操作這個列表,同時觸發(fā)一些事件。如當(dāng)鼠標(biāo)滾動時會觸發(fā)setOnItemSelectedListener事件,點(diǎn)擊時那么會觸發(fā)setOnItemClickListener事件。下面我們還是通過一個具體的實(shí)例來學(xué)習(xí)ListView的用法。4.3技術(shù)準(zhǔn)備4.3.1知識點(diǎn)1:ListView在實(shí)例4-1中我們將周一~周日放到ListView中,設(shè)置長按事件響應(yīng)和選擇事件響應(yīng),并在TextView中來顯示所選日期。先來看下程序的運(yùn)行結(jié)果,圖4-2所示是中選擇周二時,在TextView中便提示了所選擇的日期。圖4-3所示是用戶在一個選項(xiàng)上長按后會彈出菜單的界面。圖4-2

選擇ListView中的選項(xiàng)

圖4-3

長按事件響應(yīng)4.3技術(shù)準(zhǔn)備還需要注意的是,在ListView中“選擇”和“點(diǎn)擊”是兩個不同的概念。在例子中我們點(diǎn)擊一個選項(xiàng)后會在TextView中提示“你點(diǎn)擊的是…”,如圖4-4所示。圖4-4

點(diǎn)擊一個選項(xiàng)4.3.1聲外表波器件4.3技術(shù)準(zhǔn)備在編碼實(shí)現(xiàn)的時候需要創(chuàng)立LinearLayout和ListView兩個對象。LinearLayout用來顯示ListView,然后通過ArrayAdapter將獲得的數(shù)組添加到ArrayAdapter中,再將ArrayAdapter添加到ListView中,將ListView添加到LinearLayout中,接著在ListView的視圖中添加setOnItemSelectedListener()和setOnItemClickListener()兩個監(jiān)聽方法,分別來處理選擇事件和單擊事件,最后添加setOnCreateContextMenuListener()監(jiān)聽來處理長按事件。4.3.1聲外表波器件4.3技術(shù)準(zhǔn)備程序代碼如代碼清單4-1所示:4.3.1聲外表波器件代碼清單4-1第四章\CH4_1\src\sziit\practice\chapter4\CH4_1.javapublicclassCH4_1extendsActivity//從Activity基類派生子類CH4_1{privatestaticfinalString[]array={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};//定義私有靜態(tài)只讀String[]數(shù)組LinearLayoutmyLinearLayout;//定義線性布局LinearLayout對象TextViewmyTextView;//定義TextView對象ListViewmyListView;//定義ListView對象

publicvoidonCreate(BundlesavedInstanceState)//子類重寫基類的onCreate方法

{super.onCreate(savedInstanceState);//調(diào)用基類的onCreate方法myLinearLayout=newLinearLayout(this);//新增LinearLayoutmyLinearLayout.setOrientation(LinearLayout.VERTICAL);//設(shè)置成垂直線性布局方式myLinearLayout.setBackgroundColor(android.graphics.Color.WHITE);//將背景顏色設(shè)置為白色myTextView=newTextView(this);//新增TextViewLinearLayout.LayoutParamsparam1=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);myTextView.setText(R.string.title);//設(shè)置myTextView對象顯示的信息myTextView.setTextColor(getResources().getColor(R.drawable.blue));//設(shè)置字體顏色myLinearLayout.addView(myTextView,param1);//將TextView加到myLinearLayoutmyListView=newListView(this);//新增ListViewLinearLayout.LayoutParamsparam2=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);myListView.setBackgroundColor(getResources().getColor(R.drawable.ltgray));myLinearLayout.addView(myListView,param2);//將ListView加到myLinearLayoutsetContentView(myLinearLayout);//將LinearLayout加到ContentView//newArrayAdapter對象并將array字符串?dāng)?shù)組傳入ArrayAdapteradapter=newArrayAdapter(this,R.layout.my_simple_list_item,array);myListView.setAdapter(adapter);//將ArrayAdapter參加ListView對象中//myListView參加OnItemSelectedListener事件的監(jiān)聽器myListView.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){publicvoidonItemSelected(AdapterViewarg0,Viewarg1,intarg2,longarg3){//處理回調(diào)方法onItemSelected//使用getSelectedItem()將選取的值帶入myTextView中myTextView.setText("你選的是"+arg0.getSelectedItem().toString());}publicvoidonNothingSelected(AdapterViewarg0){}});//myListView參加OnItemClickListener事件的監(jiān)聽器myListView.setOnItemClickListener(newAdapterView.OnItemClickListener(){publicvoidonItemClick(AdapterViewarg0,Viewarg1,intarg2,longarg3){//處理回調(diào)方法onItemClick//使用String[index],arg2為點(diǎn)選到ListView的index,并將值帶入myTextView中myTextView.setText("你點(diǎn)擊的是"+array[arg2]);}});//設(shè)置長按那么彈出菜單myListView.setOnCreateContextMenuListener(newOnCreateContextMenuListener(){ publicvoidonCreateContextMenu(ContextMenumenu,Viewv, ContextMenuInfomenuInfo){ menu.setHeaderTitle("長按菜單"); menu.add(0,0,0,"彈出長按菜單0");menu.add(0,1,0,"彈出長按菜單1"); }});}}4.3技術(shù)準(zhǔn)備4.3.1聲外表波器件以上代碼還用到了我們定義的my_simple_list_item.xml,它定義了用來顯示ListView中Item的組件,通過這個組件我們才可以獲得用戶所選擇的Item,其代碼如代碼清單4-2所示。代碼清單4-2第四章\CH4_1\res\layout\my_simple_list_item.xml<?xmlversion="1.0"encoding="utf-8"?><CheckedTextViewxmlns:android="://schemas.android/apk/res/android"android:id="@+id/myCheckedTextView1"android:layout_width="fill_parent"android:layout_height="fill_parent"android:textColor="@drawable/black"/>4.3技術(shù)準(zhǔn)備4.3.1聲外表波器件此外還要注意,在程序中使用LinearLayout對象,動態(tài)地將TextView與ListView添加到原來Layout中的main.xml布局中。LinearLayout.LayoutParamsparam1:用來創(chuàng)立一個LayoutParams對象param1,再調(diào)用myLinearLayout.addView(myTextView,param1)來將param1對象傳入,動態(tài)添加TextView。myListView.setOnCreateContextMenuListener()用來添加上下文菜單項(xiàng)選擇項(xiàng),我們會后面的章節(jié)中學(xué)習(xí)。4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)正如本節(jié)前面所講的一樣,對話框也是Android為我們提供的一種可見的組件。Android提供了不同類型的對話框,其實(shí)前面我們已經(jīng)接觸過對話框了,那就是DatePickerDialog、TimePickerDialog。除了我們講過的這兩個對話框外,還有Dialog,它就相當(dāng)于javascript中的Alert一樣,用來顯示提示信息;還有一種是AlertDialog,它是一個簡單的可以交互的對話框,跟JavaScript中的confirm對話框是一樣的效果:能夠允許用戶選擇yes或者no,設(shè)置單項(xiàng)選擇按鈕、復(fù)選按鈕或者簡單的文本輸入。4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)當(dāng)然還有一種對話框就是ProcessDialog。對于ProgressDialog,在Windows窗口程序或者Flash程序中會經(jīng)常見到,諸如“加載中…”等對話框。在Android系統(tǒng)中,我們那么是通ProgressDialog來運(yùn)行,這個類封裝在里,但是需要注意一點(diǎn):在Android中,ProgressDialog必須要在后臺程序運(yùn)行完畢前,以dismiss()方法來關(guān)閉取得焦點(diǎn),否那么程序就會陷入無法終止的無窮循環(huán)中;又或者在線程里不可有任何更改Context或parentView的任何狀態(tài)、文字輸出等事件,因?yàn)榫€程中的Context和View并不屬于parent,兩者之間沒有關(guān)聯(lián)。4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)下面我們就通過一個例子來看一下關(guān)于Android中對話框的類型和使用方法。首先來模擬一個論壇發(fā)表評論時經(jīng)常出現(xiàn)的一個場景,也就是當(dāng)我們要發(fā)表評論時首先需要登錄,登錄后才可以發(fā)表評論。在這個例子中,首先要為Activity設(shè)置布局,在這里使用的布局就是main.xml文件,只是我們添加了一個Button、一個EditText和一個TextView。這里就不再詳細(xì)列出布局文件的代碼,只是將布局后的效果給讀者,如圖4-5所示,讀者可以自己完成,源代碼在本書第四章/CH4_2源代碼中。4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)圖4-5Main.xml布局文件效果圖4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)另外,在這個例子中還需要對我們自定義的對話框的布局進(jìn)行設(shè)置。圖4-6所示就是我們自己定義的登錄框,其中包括兩個TextView和兩個EditText。圖4-6自定義對話框4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)其布局文件如代碼清單4-3所示。代碼清單4-3第四章\CH4_2\res\layout\login.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="://schemas.android/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content"><TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:text="賬號" android:gravity="left" android:textAppearance="?android:attr/textAppearanceMedium"/><EditText android:id="@+id/userName" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:scrollHorizontally="true" android:autoText="false" android:capitalize="none" android:gravity="fill_horizontal" android:textAppearance="?android:attr/textAppearanceMedium"/> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:text="密碼" android:gravity="left" android:textAppearance="?android:attr/textAppearanceMedium"/><EditText android:id="@+id/userName" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:scrollHorizontally="true" android:autoText="false" android:capitalize="none" android:gravity="fill_horizontal" android:password="true" android:textAppearance="?android:attr/textAppearanceMedium"/></LinearLayout>4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)在上面的代碼中需要注意幾個屬性的應(yīng)用:android:gravity="left"表示對齊方向;android:textAppearance="?android:attr/textAppearanceMedium"表示文字的顯示外觀,其中有4個外觀:android:textAppearance="?android:attr/textAppearanceSmall"

android:textAppearance="?android:attr/textAppearanceMedium"android:textAppearance="?android:attr/textAppearanceLarge"android:textAppearance="?android:attr/textAppearanceLarge代碼中,android:scrollHorizontally="true"表示當(dāng)文字超出一行時是否出現(xiàn)滾動條;android:layout_marginLeft和android:layout_marginRight表示左右邊空白的大小。4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)在設(shè)置以上布局后,先來看一下主程序中的源代碼,如代碼清單4-4所示。代碼清單4-4第四章\CH4_2\src\sziit\practice\chapter4//包的引入省略publicclassCH4_2extendsActivity{//從Activity基類派生子類

ProgressDialoglogining;//定義ProgressDialog對象

publicvoidonCreate(BundlesavedInstanceState){//子類重寫基類的onCreate方法

super.onCreate(savedInstanceState);//調(diào)用基類的onCreate方法

setContentView(R.layout.main);//設(shè)置屏幕布局,通過引用布局資源

ButtonbtnCommont=(Button)findViewById(R.id.btnCom);//引用布局文件定義的Button

btnCommont.setOnClickListener(newOnClickListener(){//設(shè)置OnClickListener監(jiān)聽器publicvoidonClick(Viewv){//處理點(diǎn)擊回調(diào)方法onClick Dialogdialog=newAlertDialog.Builder(CH4_2.this)//創(chuàng)立AlertDialog對話框 .setTitle("登錄提示")//設(shè)置登錄提示 .setMessage("您還沒有登錄,請先登錄")//設(shè)置提示信息 .setPositiveButton("確定",//設(shè)置確定按鈕 newDialogInterface.OnClickListener(){//設(shè)置OnClickListener監(jiān)聽器 publicvoidonClick(DialogInterfacedialog, intwhich){//處理點(diǎn)擊回調(diào)方法onClick //跳轉(zhuǎn)到登錄框 LayoutInflaterfactory=LayoutInflater.from(CH4_2.this);//用來將xml文件轉(zhuǎn)成View finalViewDialogView=factory.inflate(R.layout.login,null); AlertDialogdlg=newAlertDialog.Builder(CH4_13.this) .setTitle("登陸框") .setView(DialogView) .setPositiveButton("確定",//設(shè)置確定按鈕 newDialogInterface.OnClickListener(){ publicvoidonClick( DialogInterfacedialog,intwhich){logining=ProgressDialog.show(CH4_2.this,"登錄中","正在登錄,請稍后……",true);newThread(){publicvoidrun(){try{sleep(3000);}catch(Exceptione){e.printStackTrace();}finally{logining.dismiss(); }}}.start();}}).setNegativeButton("取消",//設(shè)置取消按鈕事件newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhich){CH4_2.this.finish();}}).create();dlg.show();}}).setNeutralButton("取消",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhich){CH4_2.this.finish(); }}).create();//創(chuàng)立dialog.show();//顯示}});}}4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)在例子中點(diǎn)擊“評論”按鈕后,彈出提示登錄對話框,點(diǎn)擊“確定”時就會跳轉(zhuǎn)到登錄框中,如圖4-7所示。圖4-7登錄示意圖4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)在上面的代碼中我們需要注意:factory=LayoutInflater.from(CH4_2.this);//用來將xml文件轉(zhuǎn)成ViewfinalViewDialogView=factory.inflate(R.layout.login,null);以上兩行代碼將設(shè)置的布局文件login.xml用LayoutInflater對象的inflate方法轉(zhuǎn)換成View。另外,從上面的例子中我們可以看到用AlertDialog來創(chuàng)立對話框是非常方便的,使用AlertDialog.Builder可以很方便地創(chuàng)立指定內(nèi)容及樣式的對話框。4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)AlertDialog.Builder還提供了多種方法來定制對話框,大致介紹如下。setTitle(CharSequencetitle),setTitle(inttitleId):設(shè)置標(biāo)題字符串。setSingleChoiceItems:設(shè)置為單項(xiàng)選擇選項(xiàng)對話框。setMultiChoiceItems:設(shè)置為多項(xiàng)選擇選項(xiàng)對話框。setItems:設(shè)置為選項(xiàng)對話框,不區(qū)分多項(xiàng)選擇單項(xiàng)選擇。setPositiveButton(inttextId,DialogInterface.OnClickListenerlistener)setPositiveButton(CharSequencetext,DialogInterface.OnClickListenerlistener)setNegativeButton(CharSequencetext,DialogInterface.OnClickListenerlistener)setNegativeButton(inttextId,DialogInterface.OnClickListenerlistener)setNeutralButton(CharSequencetext,DialogInterface.OnClickListenerlistener)setNeutralButton(inttextId,DialogInterface.OnClickListenerlistener)4.3技術(shù)準(zhǔn)備4.3.2知識點(diǎn)2:對話框(Dialog)以上方法的功能均是為對話框設(shè)置按鈕,且Positive、negative和neutral類型的按鈕最多只能設(shè)置一個。setCustomTitle(ViewcustomTitleView),設(shè)置自定義的Title視圖。setView(Viewview),設(shè)置對話框內(nèi)容為自定義的視圖。4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)前面所學(xué)到的所有控件,有許多是為了來完成和用戶交互而設(shè)計(jì)的,但是也有一些是為了增加用戶體驗(yàn)而設(shè)計(jì)的,它們用來為程序提示信息、顯示程序運(yùn)行的狀態(tài)等,就像上一節(jié)講到的登錄時的對話框一樣。本節(jié)講的那么是另外一個增加用戶體驗(yàn)的控件,叫做進(jìn)度條〔ProgressBar〕。提到進(jìn)度條大家肯定都不陌生,我們在安裝文件的時候都會出現(xiàn)一個提示安裝進(jìn)度的條,那便是進(jìn)度條。4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)進(jìn)度條與上一節(jié)我們講到的ProgressDialog是不同的,第一,它繼承自,其次,在應(yīng)用的時候,必須要新建ProgressDialog對象,在運(yùn)行時會彈出“對話框”作為提醒,此時用戶原來的應(yīng)用程序就會失去焦點(diǎn),直到進(jìn)程結(jié)束后才會將控制權(quán)交給應(yīng)用程序;第三,應(yīng)用目標(biāo)不同。在程序中我們可以將ProgressBar直接放到布局文件中并設(shè)置其屬性為“不可見”,后來通過程序來將其設(shè)置為“可見”,并能獲取程序運(yùn)行的進(jìn)度。4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)Android系統(tǒng)提供了兩個類進(jìn)度條樣式:長形進(jìn)度條〔ProgressBarStyleHorizontal〕和圓形進(jìn)度條〔ProgressBarStyleLarge〕。它們只是代表應(yīng)用程序中某一局部程序的執(zhí)行情況,而整個應(yīng)用程序執(zhí)行的進(jìn)度,那么可以通過應(yīng)用程序標(biāo)題欄來顯示一個進(jìn)度條,這就需要先對窗口的顯示風(fēng)格進(jìn)行設(shè)置:“requestWindowFeature(Window.FEATURE_PROGRESS);”。4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)下面我們就通過實(shí)例來學(xué)習(xí)進(jìn)度條的用法和Handler的使用。我們在這個例子中將ProgressBar與Handler進(jìn)行整合,通過Handler以及Message對象將進(jìn)程里的狀態(tài)往外傳遞,最后由Activity的Handler事件接收并取得運(yùn)行狀態(tài)。4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)以下先來看一下實(shí)例運(yùn)行的截圖,如圖4-8所示。圖4-8實(shí)例CH4_3運(yùn)行圖4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)要實(shí)現(xiàn)進(jìn)度條,需要在布局文件中進(jìn)行聲明。其標(biāo)簽為<ProgressBar></ProgressBar>。布局文件源代碼如代碼清單4-5所示。代碼清單4-5第四章\CH4_3\res\layout\main.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="://schemas.android/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:id="@+id/txtInfo"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="200dp" android:layout_height="wrap_content" android:visibility="gone"/><ProgressBar android:id="@+id/progressBar2" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:max="100" android:progress="50" android:secondaryProgress="70" android:visibility="gone"/><Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start"/></LinearLayout>4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)在上面的代碼中,style表示進(jìn)度條的風(fēng)格,定義是長形進(jìn)度條還是圓形進(jìn)度條。Android:max=""為設(shè)置進(jìn)度條的最大值,android:progress=""為設(shè)置進(jìn)度條的當(dāng)前值,Android:visibility=""為設(shè)置進(jìn)度條的可見性。在這里我們設(shè)置為“gone”,在程序中通過按鈕事件來改變其可見性的屬性。 protectedstaticfinalintGUI_STOP_NOTIFIER=0x108;//定義靜態(tài)只讀int常量 protectedstaticfinalintGUI_THREADING_NOTIFIER=0x109;//定義靜態(tài)只讀int常量 publicintintCounter=0;//定義公有int變量 publicvoidonCreate(BundlesavedInstanceState){//子類重寫基類的onCreate方法 super.onCreate(savedInstanceState);//調(diào)用基類的onCreate方法 requestWindowFeature(Window.FEATURE_PROGRESS);//設(shè)置窗口模式 setProgressBarVisibility(true);//顯示進(jìn)度條 setContentView(R.layout.main);//設(shè)置屏幕布局,通過R.layout.main引用布局資源 txtInfo=(TextView)findViewById(R.id.txtInfo);//獲得Progress對象 progressBar1=(ProgressBar)findViewById(R.id.progressBar1);//查找ProgressBar對象 progressBar2=(ProgressBar)findViewById(R.id.progressBar2);//查找ProgressBar對象 btnStart=(Button)findViewById(R.id.btnStart);//查找Button對象 progressBar1.setIndeterminate(false);//setIndeterminate設(shè)置進(jìn)度條是否自動運(yùn)轉(zhuǎn)

progressBar2.setIndeterminate(false);//禁止進(jìn)度條自動運(yùn)行 //設(shè)置按鈕的事件監(jiān)聽器 btnStart.setOnClickListener(newButton.OnClickListener(){ publicvoidonClick(Viewv){//處理事件回調(diào)方法onClick progressBar1.setVisibility(View.VISIBLE);//設(shè)置進(jìn)度條為可見狀態(tài) progressBar2.setVisibility(View.VISIBLE);//設(shè)置進(jìn)度條為可見狀態(tài) progressBar1.setMax(100);//設(shè)置progressBar1的最大值 progressBar1.setProgress(0);//設(shè)置progressBar的當(dāng)前值 progressBar2.setProgress(0);//設(shè)置progressBar的當(dāng)前值 //通過線程來改變ProgressBar的值 newThread(newRunnable(){//創(chuàng)立進(jìn)程 publicvoidrun(){//重寫run方法 for(inti=0;i<10;i++){ try{ intCounter=(i+1)*20;//成員變量,用來識別加載進(jìn)度 Thread.sleep(1000);//循環(huán)一次,暫停一秒 //運(yùn)行五秒后結(jié)束 if(i==4){//發(fā)送消息 Messagem=newMessage();//以Message對象,傳遞參數(shù)給Handler m.what=CH4_3.GUI_STOP_NOTIFIER; CH4_3.this.myMessageHandler.sendMessage(m); break; }else{ Messagem=newMessage();//創(chuàng)立Message對象 m.what=CH4_3.GUI_THREADING_NOTIFIER; CH4_3.this.myMessageHandler.sendMessage(m); }//發(fā)送消息 }catch(Exceptione){//捕獲異常 e.printStackTrace();//顯示異常信息 }}}}).start();//啟動進(jìn)程}});}HandlermyMessageHandler=newHandler(){//創(chuàng)立Handler對象 publicvoidhandleMessage(Messagemsg){//重寫handleMessage方法處理消息循環(huán) switch(msg.what){//處理接收到的消息//到達(dá)最大值時caseCH4_3.GUI_STOP_NOTIFIER: txtInfo.setText(R.stringplete);

progressBar1.setVisibility(View.GONE);//顯示進(jìn)度條 progressBar2.setVisibility(View.GONE);//顯示進(jìn)度條 Thread.currentThread().interrupt();//終止進(jìn)程 break; //處理過程中caseCH4_3.GUI_THREADING_NOTIFIER: if(!Thread.currentThread().isInterrupted()){ txtInfo.setText( getResources().getText(R.string.doing)+"("+Integer.toString(intCounter)+"%)\n"); progressBar1.setProgress(intCounter); progressBar2.setProgress(intCounter); //設(shè)置標(biāo)題欄中前景的一個進(jìn)度條值 setProgress(intCounter*100); //設(shè)置標(biāo)題欄中后面的一個進(jìn)度條值 setSecondaryProgress(intCounter*100);}break;}super.handleMessage(msg);//調(diào)用基類handleMessage方法處理默認(rèn)消息}};}4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)在上面的程序中,progressBar1.setIndeterminate(false)為設(shè)置其是否自動運(yùn)行。當(dāng)為“ture”時進(jìn)度條為不確定的進(jìn)度即進(jìn)度是未知的,對于長形的進(jìn)度條那么是一個動態(tài)的動畫而不是進(jìn)度。其運(yùn)行截圖如圖4-9所示。圖4-9未知進(jìn)度的進(jìn)度條4.3技術(shù)準(zhǔn)備4.3.3知識點(diǎn)3:進(jìn)度條(ProgressBar)對于圓形的進(jìn)度條,因?yàn)槠浔旧聿⒉恢С謎ndterminatemode循環(huán)圖片方式,所以我們在程序中通過TextView將進(jìn)度以文字的形式顯示出來。另外進(jìn)度條的圖片除了圓形之外,還有其他主題以及方形圖片Drawable模式可以使用,感興趣的讀者可以自己學(xué)習(xí)。4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單Android系統(tǒng)里面有3種類型的菜單:optionsmenu,contextmenu,submenu。1.optionsmenu

按Menu鍵就會顯示,用于當(dāng)前的Activity。它包括兩種菜單項(xiàng):iconmenu和expandedmenu。因?yàn)閛ptionsmenu在屏幕底部最多只能顯示6個菜單項(xiàng),這些菜單項(xiàng)稱為iconmenu,iconmenu只支持文字(title)以及icon,可以設(shè)置快捷鍵,不支持checkbox以及radio控件,所以不能設(shè)置checkable選項(xiàng)。而多于6的菜單項(xiàng)會以“more”iconmenu來調(diào)出,稱為expandedmenu。它不支持icon,其他的特性都和iconmenu一樣。

4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單在Activity里面,一般通過以下函數(shù)來使用optionsmenu:Activity::onCreateOptionsMenu(Menumenu)

創(chuàng)立optionsmenu,這個函數(shù)只會在menu第一次顯示時調(diào)用。Activity::onPrepareOptionsMenu(Menumenu)

更新改變optionsmenu的內(nèi)容,這個函數(shù)會在menu每次顯示時調(diào)用。Activity::onOptionsItemSelected(MenuItemitem)

處理選中的菜單項(xiàng)。4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單2.contextmenu

要在相應(yīng)的view上按幾秒后才顯示的,用于view,跟某個具體的view綁定在一起這類型的菜單不支持icon和快捷鍵。在Activity里面,一般通過以下函數(shù)來使用contextmenu:Activity::registerForContextMenu(Viewview)

為某個view注冊contextmenu,一般在Activity::onCreate里面調(diào)用。Activity::onCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo)

創(chuàng)立contextmenu,和optionsmenu不同,contextmeun每次顯示時都會調(diào)用這個函數(shù)。Activity::onContextItemSelected(MenuItemitem)

處理選中的菜單項(xiàng)。4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單3.submenu以上兩種menu都可以參加子菜單,但子菜單不能嵌套子菜單,這意味著在Android系統(tǒng),菜單只有兩層,設(shè)計(jì)時需要注意的,同時子菜單不支持icon。4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單4.Xml在菜單中的使用上述的三種類型的menu都能夠定義為xml資源,但需要手動地使用MenuInflater來得到Menu對象的引用。

一個菜單,對應(yīng)一個xml文件,因?yàn)橐笾荒苡幸粋€根節(jié)點(diǎn)<menu>。xml文件保存為res/menu/some_file.xml。Java代碼引用資源接下來介紹相關(guān)的節(jié)點(diǎn)和屬性(所有的屬性都定義為android空間內(nèi)。4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單4.Xml在菜單中的使用例如android:icon="@drawable/icon"):<menu>

根節(jié)點(diǎn),沒有屬性。<group>

表示在它里面的<item>在同一group。相關(guān)屬性包括:

id:groupid

menuCategory:對應(yīng)

常量MenuCATEGORY_*

—定義了一組的優(yōu)先權(quán),有效值:container,system,secondary,和alternative

orderInCategory:定義這組菜單在菜單中的默認(rèn)次序,int值

checkableBehavior:這組菜單項(xiàng)是否checkable。有效值:none,all(單項(xiàng)選擇/單項(xiàng)選擇按鈕radiobutton),single(非單項(xiàng)選擇/復(fù)選類型checkboxes)

visible:這組菜單是否可見trueorfalse

enabled:這組菜單是否可用,trueorfalse<item>

菜單項(xiàng),可以嵌入<menu>作為子菜單。相關(guān)屬性包括:

id:

itemid

menuCategory:用來定義menu類別

orderInCategory:用來定義次序,與一個組在一起(Usedtodefinetheorderoftheitem,withinagroup)

title:標(biāo)題

titleCondensed:標(biāo)題摘要,當(dāng)原標(biāo)題太長的時候,需要用簡短的字符串來代替title

icon:icon圖標(biāo)

alphabeticShortcut:字母快捷鍵

numericShortcut:數(shù)學(xué)快捷鍵

checkable:是否為checkbox,trueorfalse

checked:是否設(shè)置為checked狀態(tài),trueorfalse

visible:是否可見,trueorfalse

enabled:是否可用,trueorfalse4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單下面我們就來看一下一個OptionMenu和ContextMenu的簡單范例程序,運(yùn)行效果如圖4-10和4-11所示。圖4-10ContextMenu例如圖4-11OptionMenu例如4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單我們來分析下程序的代碼,看要如何設(shè)置菜單。代碼如代碼清單4-7所示。代碼清單4-7第四章\CH4_4\src\sziit\practice\chapter4\CH4_4.javapublicclassCH4_4extendsActivity{//從Activity基類派生子類CH4_4 publicImageViewimageView;//聲明ImageView的對象publicvoidonCreate(BundlesavedInstanceState){//子類重寫基類的onCreate方法super.onCreate(savedInstanceState);//調(diào)用基類的onCreate方法setContentView(R.layout.main);//設(shè)置屏幕布局,通過R.layout.main引用布局資源imageView=(ImageView)findViewById(R.id.imageView1);//為ImageView對象進(jìn)行賦值//為ImageView添加setOnCreateContextMenuListener監(jiān)聽,用以觸發(fā)上下文菜單imageView.setOnCreateContextMenuListener(newImageView.OnCreateContextMenuListener(){//設(shè)置OnCreateContextMenuListener監(jiān)聽器 publicvoidonCreateContextMenu(ContextMenumenu,Viewarg1, ContextMenuInfoarg2){//處理回調(diào)方法onCreateContextMenu menu.setHeaderIcon(R.drawable.ic_action_search); menu.setHeaderTitle("圖片"); menu.add(0,0,0,"搜索1"); menu.add(0,0,1,"搜索2"); menu.add(0,0,2,"搜索3"); }});}//參考android.app.Activity#onCreateOptionsMenu(android.view.Menu)//添加OptionMenupublicbooleanonCreateOptionsMenu(Menumenu){//重寫onCreateOptionsMenu方法getMenuInflater().inflate(R.menu.optionsmenu,menu);returntrue;} publicbooleanonOptionsItemSelected(MenuItemitem){//重寫onOptionsItemSelected方法 super.onOptionsItemSelected(item);//調(diào)用基類onOptionsItemSelected方法 switch(item.getItemId())//處理菜單項(xiàng) { caseR.id.menu_1: Toast.makeText(CH4_4.this,"關(guān)于",Toast.LENGTH_SHORT).show(); break; caseR.id.menu_2: Toast.makeText(CH4_4.this,"選擇",Toast.LENGTH_SHORT).show(); break; caseR.id.menu_3: finish(); break; } returntrue; }}4.3技術(shù)準(zhǔn)備4.3.4知識點(diǎn)4:菜單在上面的代碼中,我們通過代碼為ImageView添加了上下文菜單,同時也添加了OptionMenu,但是OptionMenu的菜單項(xiàng)并沒有在代碼中添加,而是借助于xml文件,在xml中進(jìn)行了定義。如代碼清單4-8所示。代碼清單4-8第四章\CH4_4\res\menu\optionmenu.xml<menuxmlns:android="://schemas.android/apk/res/android"><itemandroid:id="@+id/menu_1"android:title="關(guān)于"android:orderInCategory="100"/><itemandroid:id="@+id/menu_2"android:title="選擇"android:orderInCategory="100"/><itemandroid:id="@+id/menu_3"android:title="離開"android:orderInCategory="100"/></menu>4.4工程實(shí)施在本章中我們學(xué)習(xí)了ListView的使用。以下就來學(xué)習(xí)如何將所學(xué)的知識運(yùn)用到工程中,如圖4-12所示。圖4-12景點(diǎn)列表4.4工程實(shí)施在軟件中我們使用了列表來將我們的數(shù)據(jù)呈現(xiàn)給我們的用戶。但是又不僅僅是列表,我們在列表中放入了景點(diǎn)的略縮圖,那么這又是如何實(shí)現(xiàn)的呢?另外標(biāo)題欄下面的各個按鈕又是如何切換的呢?在數(shù)據(jù)加載時對話框又是如何顯示的呢?那么我們一塊其實(shí)現(xiàn)的方式。首先我們一塊來分析下頁面的布局,首先是標(biāo)題欄,再就是類似Tab的按鈕,然后一個ListView來顯示數(shù)據(jù)。那么他們的排列是用線性布局還是其他的呢?為了能夠讓我們的程序能夠適應(yīng)不同分辨率的我們建議使用相對布局。4.4工程實(shí)施代碼如代碼清單4-9所示。代碼清單4-9<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="://schemas.android/apk/res/android"android:id="@+id/root"android:background="@color/white"android:layout_width="fill_parent"android:layout_height="fill_parent"> <RelativeLayout android:id="@+id/titlebar_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/title_background" android:paddingLeft="5dip" android:paddingRight="5dip" android:paddingTop="5dip" android:paddingBottom="5dip" android:gravity="center" ><LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" > <TextView android:textAppearance="?android:textAppearanceMedium" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/local_tour" android:textSize="@dimen/title_textSize" android:textColor="@color/white"

android:gravity="center" /> </LinearLayout> </RelativeLayout><LinearLayout android:layout_below="@id/titlebar_layout"android:id="@+id/layoutBar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/big_button_up"android:orientation="horizontal"><RelativeLayoutandroid:id="@+id/sense_layout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1.0"><TextViewandroid:id="@+id/sense_tab"android:layout_width="fill_parent"android:gravity="center"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textSize="@dimen/tab_textsize"android:textAppearance="?android:textAppearanceMedium" android:textColor="@color/black"android:text="@string/tour_scene"/></RelativeLayout><RelativeLayoutandroid:id="@+id/food_layout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1.0"><TextViewandroid:id="@+id/food_tab"android:layout_width="fill_parent"android:gravity="center“android:layout_height="wrap_content"android:layout_centerInParent="true"android:textAppearance="?android:textAppearanceMedium" android:textColor="@color/black"android:textSize="@dimen/tab_textsize"android:text="@string/tour_food"/></RelativeLayout><RelativeLayoutandroid:id="@+id/quarter_layout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1.0"

溫馨提示

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

評論

0/150

提交評論