Android SDK簡明教程:使用者互動

51CTO發表於2014-11-26

在這篇教程中,我們將對之前所新增的Button元素進行設定以實現對使用者點選的檢測與響應。為了達成這一目標,我們需要在應用程式的主Activity類中略微涉及Java程式設計內容。如果大家在Java開發方面的經驗不太豐富也沒必要擔心,只要按步驟進行即可完成學習。我們將在本系列的下一篇文章中深入探討Java語法,從而保證大家瞭解初步Android開發任務中所必需的程式語言知識。

大家可以在Android當中以多種不同方式實現使用者互動。我們將學習兩種最為典型的處理方案,從而實現應用按鈕對使用者點選的感應——兩種方案都會用到一點XML程式碼以及Java實施流程。Android當中包含幾種不同的互動UI元素,足以感應來自使用者的各類輸入操作。輸入操作的處理方式必須與UI項相匹配,但整個過程仍然大體相同。我們將以一個按鈕為起點開始探索Android平臺上的使用者互動,因為按鈕無疑是最簡單也最常用的介面元素。

1.使用者互動基礎

在進一步探討細節之前,我要首先為剛剛接觸應用程式開發工作的朋友們解釋幾項UI概念。為了實現應用互動,我們需要利用特定元素檢測使用者的互動操作。看過上一篇文章的朋友一定還記得,Android中存在View,而在今天的示例中具體是指Button。要實現互動,我們首先需要“監聽”使用者的操作。雖然Android主要執行在搭載觸控螢幕的移動裝置上,但大家仍然可以在計算機上利用程式語言處理互動開發。舉例來說,在後面提到“點選”的部分,我們指的是利用滑鼠點選或者用手指觸控/點觸對應位置。

使用者與應用程式的互動方式是多種多樣的。他們可以點觸、划動以及“長按”對應專案。當這些操作活動發生時,我們將其稱為一個“事件”。因此,我們需要通過設定讓應用程式監聽特定UI專案上是否發生了特定事件。在今天的示例中,我們需要監聽針對Button的點選(或者點觸/觸控)操作。

我們需要監聽並響應這類使用者事件。要做到這一點,我們將向Java Activity類中新增程式碼以實現對按鈕點選的監聽與響應。只要按鈕上出現點選事件,這部分程式碼就會開始執行。雖然其它型別的使用者互動會涉及不同的方法程式碼以及多種多樣的事件型別,但其基本過程都是相通的。

2.識別UI元素

第一步

為了指明使用者互動具體指向哪個View,我們需要在應用程式當中識別出每個互動性View。在文章列舉的範例中,我們只討論一個View——但大家在今後實際進行應用開發時,可能會用到多種不同型別的互動性View。為了讓它們彼此之間有條不紊地運作,我們需要為每個View設定一個用於識別的獨特ID屬性,並將其應用於整個應用程式。首先在Eclipse中開啟我們的主佈局檔案並切換到XML編輯標籤。接下來找到我們為Button元素新增的程式碼,利用以下語法為其分配一個ID:

android:id="@+id/myButton"

我們需要為Android佈局中所使用的每一個元素分配ID屬性,從而幫助自己順利識別每個View元素。請注意以上程式碼中的“@+id”語法。這會提示Android工具在專案資源“R.java”檔案中建立一個新ID,併為其指定一個在應用程式內獨一無二的文字字串,也就是“myButton”。在應用中XML佈局程式碼的其餘部分乃至其它XML與Java檔案內,我們將使用這一名稱來指定Button View。而後儲存當前佈局檔案。

第二步

開啟應用程式中的主Activity檔案。我們將向其中新增一點點Java程式碼,但大家不用為自己令人捉急的Java水平而擔憂,只要理解其中與處理使用者互動相關的大致流程即可。如果各位朋友原先從未接觸過Java,請繼續關注我們的下一篇教程,到時候回頭再看就會發現現在的內容其實非常簡單。我們要在Activity類中建立一個變數來引用Button View。在類宣告開頭、起始內容之後:

public class MainActivity extends Activity {

新增變數宣告:

private Button theButton;

我們的宣告包含視覺特性(下一次再詳加說明)、變數型別以及變數名稱。Eclipse可能會在“Button”文字部分加註下劃線並提示“Button不能被解析為一個型別”。由於我們使用的是由Android平臺所提供的Button型別,所以必須將其匯入至類檔案當中。將滑鼠懸停在“Button”文字上方,Eclipse將為我們顯示出一套建議列表。在其中選擇“Import‘Button’(android.widget)”。這樣類檔案頂部就會出現一個可以自由展開與收起的匯入宣告列表。

第三步

現在我們可以在佈局當中取回指向Button View的引用,並將該引用儲存在我們所建立的變數當中。在我的Activity onCreate方法中,緊接著以下程式碼行進行佈局設定:

setContentView(R.layout.activity_main);

如下所示輸入一行新程式碼以取回Button:

theButton = (Button)findViewById();

在“findViewById()”的括號中輸入“R.”——Eclipse會為我們提供資源型別提示列表。在其中選擇“id”。

輸入另一個句號“.”——Eclipse會顯示現有ID值列表。目前我們只新增了一個ID值,選擇我們為Button設定的ID名稱——也就是“myButton”。

大家會定期利用這種方法在Java程式碼當中實現資源引用。現在我們應該擁有以下程式碼行:

theButton = (Button)findViewById(R.id.myButton)

這條宣告將Button View引用分配到了我們剛剛建立的新變數當中,旨在利用其ID實現View識別。

3.監聽事件

第一步

在我們要求時,Android系統只會在View上檢測事件。因此我們需要為View分配一個監聽器。分配監聽器也有幾種不同的途徑,不過我們還是先從最簡便的入手:由Activity類自身進行點選的監聽與響應。在類的開頭按以下內容對宣告行進行擴充套件:

public class MainActivity extends Activity implements OnClickListener {

與前面提到的情況一樣,Eclipse這次又會對“OnClickListener”型別提出警告。老辦法,滑鼠懸停在錯誤內容上方並根據需求進行匯入——選擇“Import‘OnClickListener’(android.view.View)”。在這裡,大家可以看到Eclipse如何幫助我們管理專案中的各組成部分。現在它又顯示出另一條錯誤資訊,提示我們需要實施一種方法。先不管它,這個問題放到後面解決。

程式碼中“implements OnClickListener”部分是指該Activity類將採用一套特定介面。下一次我們會更深入地探討其具體細節——它從本質上意味著該類將提供一類特殊功能,在我們的例子中該功能允許大家處理點選操作。

第二步

回到Activity onCreate方法。在我們通過ID將Button View引用分配給變數的程式碼行下面,新增新的程式碼行:

theButton.setOnClickListener(this);

這一行命令應用程式監聽Button上的點選操作。括號中的“this”指定處理點選操作的物件。在本文的示例中,該物件指代Activity類執行例項本身。

4.響應事件

第一步

現在我們已經能夠響應按鈕點選了。在類onCreate方法的最後加入右括號:

theButton.setOnClickListener(this);

新增以下方法概要:

public void onClick(View v){ 
        //respond to click 
}

再次進行匯入流程,在“View”上方懸停並選擇“Import‘View’(android.view)”。由於我們已經命令該類監控按鈕上的點選,因此當點選操作發生時,方法就將開始執行(其內容,或者說“方法本體”,將被放置在兩個大括號之間)。其中的“View v”是該方法的一項引數,代表該方法將作為指向被點選View的引用處理,這樣我們就能對其進行識別。

第二步

在onClick方法當中,我們首先需要檢查被點選的是哪個View。我們只設定了一種點選監聽機制,但應用程式之後可能需要處理多種View點選。在方法本體當中,檢查已經通過的View引數是否就是我們引用到變數當中的按鈕:

if(v.getId()==theButton.getId()){ 
    //the button was clicked 
}

這是一個條件語句(之後我們再來詳細討論其具體結構),用於檢查被點選的View是否擁有與我們的變數相同的ID。如果這部分內容得到執行,我們就能斷定確實是經過設定的按鈕受到點選。如果互動元素只有這一個,那麼測試過程似乎沒什麼必要;但大家可以想象當應用中的可點選元素越來越多時,我們必然要在onClick執行時判斷被觸發的到底是哪一個。

第三步

在onClick中的if條件部分,我們可以對按鈕點選操作做出響應。響應取決於該按鈕在實際應用中的作用,不過在此次示例中,我們只是為了演示整個過程。新增以下程式碼:

theButton.setText("Ouch");

這裡我們只需簡單在按鈕被點選後改變其上顯示的文字內容。現在大家的onClick方法應該如下所示:

public void onClick(View v){ 
    //respond to click 
    if(v.getId()==theButton.getId()){ 
        //the button was clicked 
        theButton.setText("Ouch"); 
    } 
}

下圖為我們在虛擬裝置上點選該按鈕後的效果。以後我們將討論如何讓應用程式執行在物理及虛擬裝置之上,但現在大家只需觀察響應結果即可。

5. 替代方案與選項

第一步

我們已經演示了一種在Android上處理按鈕點選的方法,但方法絕不止這一種。值得關注的另一種替代方案是將下列屬於新增到XML佈局中的Button內:

android:onClick="buttonClicked"

上述程式碼會在按鈕被點選後指定需要執行的方法名稱。對應方法應該被新增到顯示在佈局中的Activity類當中。這樣一來,我們就不必向Activity類中加入大量程式碼,包括建立Button變數、在其中儲存View引用、實施OnClickListener或者為該按鈕設定一個專門的點選監聽類。在本次示例中,我們可以通過新增以下程式碼(使用同樣的程式碼以實現一致的操作效果)來取代向類中新增onClick方法:

public void buttonClicked(View v){ 
   Button theButton = (Button)v; 
   theButton.setText("Ouch");

儘管這種方法看起來似乎更簡單,但它利用Java讓引用指向佈局元素的過程值得認真關注——大家在今後的應用程式開發過程中會經常用到。另外,如果大家的佈局當中包含多個可點選專案,可能會更傾向於在同一個方法內處理所有點選事件——在這種情況下,文章前面提到的方案會更為理想。

除了文章中提到的兩套方案,我們還可以通過其它多種途徑實現View上的點選處理任務,但其它辦法要更復雜一些,不太適合作為新手教學來使用。

第二步

在這篇教程中,我們瞭解瞭如何利用最基本的方式處理Android系統中的按鈕點選事件。該平臺還針對不同View型別提供一系列其它使用者事件的處理能力,包括長按、按鍵以及觸控等等。感興趣的朋友可以參閱Android開發者指南,從中瞭解自己在未來的專案開發工作中可能接觸到的各類事件處理任務。

總結

在這一部分當中,我們探討了如何遵循基本流程實現Android UI中對使用者點選按鈕的響應。今天涉及到的內容與整套Android使用者互動機制相比只能算是九牛一毛,但大家應該能夠從這種通用型方法中領會主幹、從而指導自己在未來的專案中拿出符合使用者輸入習慣的開發成果。在本系列的其它教程中,我們將瞭解Java語言中最為本質的主要特性,從而在Android開發的學習當中取得一個又一個輝煌的勝利。

相關文章