Part 2 開發Android應用程式的流程 單元05 瞭解Android程式專案的架構和查詢SDK說明文件 單元06 使用TextView、EditText和Button介面元件 單元07 程式的錯誤類型和除錯方法 單元08 使用Android模擬器的技巧 單元09 良好的程式架構是程式開發和維護的重要基礎 單元10升級Android手機程式成為平板電腦程式
單元5 瞭解Android程式專案的架構和查詢SDK說明文件
Android程式的執行流程 Android程式專案的程式碼是放在專案的src資料夾,該資料夾中會根據建立專案時輸入的Package Name建立一個Package,再把程式檔置於其中,而程式檔的名稱就是在建立專案時輸入的Activity名稱。 package tw.android; import android.app.Activity; import android.os.Bundle; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } 指定程式 介面 4
Eclipse操作技巧 在程式碼編輯視窗中如果看到某一行的最前面有一個小圓圈裡面有一個加號,表示可以用滑鼠按一下那個加號把程式碼進一步展開。如果是小圓圈裡面有一個減號,則表示可以按一下把程式碼收起來。 5
程式專案的資源類別 程式專案的資源類別gen/(Package Name)/R.java,這個類別中整合了這個程式專案中所有的資源,包括drawable(圖檔)、layout(程式介面)、和string(字串)等不同的子類別。它是由Android程式編譯器自動產生,請不要做任何修改,其中的子類別layout中的main屬性就是對應到專案下的res/layout/main.xml檔。 package tw.android; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; public static final class layout { public static final int main=0x7f030000; public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; 6
查詢Android SDK說明文件 在安裝Android SDK的資料夾中有許多程式設計相關的參考資料,有關類別相關的技術文件是放在docs資料夾裡頭,用網頁瀏覽器開啟其中的index.html就可以看到Android developers的首頁。 此外也可以利用網際網路連到Android developers網站,該網站同樣也可以查詢Android SDK的說明文件。 電腦中的資料和Android developers網站上的資料的差異是電腦上的資料不會自動更新,但是Android developers網站上的資料會由Google公司負責持續地更新。 7
查詢Android SDK說明文件 如果是要查特定套件的資料,請點選網頁左邊上方的「Package Index」 如果想要直接查詢特定的類別,可以點選網頁左邊上方的「Class Index」 8
查詢Android SDK說明文件 利用畫面右上方的Search按鈕,在該按鈕左邊的欄位輸入類別名稱,輸入的同時在下方會出現參考清單 在Search功能的下面有一個Filter by API Level選項,如果勾選它,然後在右邊的下拉式清單中選擇一個API Level版本,就會發現網頁左邊的套件清單中有些變成灰色。這項功能是說如果把程式專案的Minimum SDK屬性設定成這個API Level版本,這些灰色的套件就不能使用。 9
查詢Android SDK說明文件 由於Android SDK的所有類別都是以物件導向技術的繼承方式產生,在每一個類別說明頁的最上方都會有一個繼承的階層圖。如果在目前的類別說明頁中查不到想要的屬性或是方法,就表示該屬性或方法是定義在它所繼承的基礎類別中,這時候可以依照繼承的階層圖查閱它的基礎類別。 10
Dev Guide說明文件 點選Android SDK網頁上方的Dev Guide就會出現右圖的網頁,網頁的左邊列出各種程式設計主題的分類,點選有興趣的項目就會在網頁右邊出現說明文件。 11
單元6 使用TextView、EditText和Button介面元件
TextView介面元件 TextView介面元件的功能是顯示訊息,使用者無法編輯其中的文字,我們可以依照如下的語法格式在介面佈局檔中加入TextView元件 <TextView android:id="@+id/自訂元件名稱" android:屬性="屬性值" ․․․ /> 這是xml的語法,TextView是標籤名稱,後面則是它的屬性。第一個屬性android:id是設定這個TextView元件的名稱,它的值「@+id /自訂元件名稱」其中的「@+id /」是一個指令,指示要將後面的元件名稱加入程式資源R中的id類別
TextView介面元件 <TextView android:id="@+id/txtResult" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="程式執行結果" /> 增加一個名為txtResult的TextView元件,它的寬度是填滿它所在的外框。它的高度則由文字的高度來決定,元件中會顯示「程式執行結果」這個字串。
程式設計技巧 在決定介面元件的id名稱時,為了在程式碼中能夠清楚的知道該介面元件的種類,我們可以在元件名稱的前面加上小寫的元件型態的縮寫,例如我們把上述TextView元件取名為txtResult,前面的3個小寫英文字母txt表示這是一個TextView介面元件,本書的所有範例都將採用這種方式來命名以方便閱讀程式碼。 15
EditText介面元件 EditText元件可以讓使用者在上面編輯文字,再讓程式讀取該字串,我們可以依照如下的語法格式在介面佈局檔中加入EditText元件 <EditText android:id="@+id/自訂元件名稱" android:屬性="屬性值" ․․․ /> 和前面的TextView元件的語法比較,二者除了標籤名稱不同以外其餘的格式都一樣
EditText介面元件 <EditText android:id="@+id/edtSex" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="text" android:text="" /> 上面的範例中新出現了一個android:inputType屬性,它是用來限制這個元件中可以輸入的字元類型,text表示任何字元都可以接受,如果設定成number則只能輸入0~9的數字字元。
Button介面元件 Button元件是讓使用者按下以啟動程式的某一項功能,我們可以依照如下的語法格式在介面佈局檔中加入EditText元件 <Button android:id="@+id/自訂元件名稱" android:屬性="屬性值" ․․․ />
Button介面元件 會在手機螢幕上建立一個按鈕,按鈕上面顯示「執行」。 <Button android:id="@+id/btnDoSug" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="執行" /> 會在手機螢幕上建立一個按鈕,按鈕上面顯示「執行」。
介面佈局檔範例 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_height="wrap_content" android:text="性別:" /> <EditText android:id="@+id/edtSex“ android:inputType="text" android:text="" android:text="年齡:" <EditText android:id="@+id/edtAge" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="number" android:text="" /> <Button android:id="@+id/btnDoSug" android:text="婚姻建議" <TextView android:id="@+id/txtResult" android:text="結果" </LinearLayout>
介面佈局檔範例
連結介面元件和程式碼 介面元件和程式碼之間必須能夠互動以完成下列3件事: btnDoSug按鈕被按下時,程式會開始執行判斷的程式碼; 程式碼必須能夠讀取edtSex和edtAge這二個EditText元件中的字串; 程式碼必須將最後的判斷結果顯示在txtResult元件中。
連結介面元件和程式碼 我們將建立在介面佈局檔中的標籤像是<TextView>、<EditText>、<Button>和<LinearLayout>稱為「介面元件」,為了在程式中使用這些「介面元件」,我們必須在程式碼中建立對應到它們的「物件」,這些用來對應到「介面元件」的「物件」必須和它們所對應的「介面元件」具備相同的型態。 23
設定Button元件的click事件listener Android這種圖形介面的程式架構就是利用各式各樣的事件處理程序來執行使用者的操作,而事件處理程序在Android程式中就稱為事件listener。要設定Button元件的事件listener需要完成下列3個步驟: Step 1. 建立一個Button的OnClickListener物件 Button.OnClickListener btnDoSugOnClick = new Button.OnClickListener() { public void onClick(View v) { // 按下按鈕後要執行的程式碼 … } }
設定Button元件的click事件listener Step 2. 在程式碼中取得res/layout/main.xml介面檔中的Button元件 定義在介面佈局檔中的所有元件在經過編譯之後都會放在gen/套件名稱/R.java資源檔中,我們可以利用findViewById()這個方法從R.java檔中取得介面元件 Button btnDoSug = (Button)findViewById(R.id.btnDoSug); 我們將取得的btnDoSug元件存入一個同名的Button物件。其實這二個物件的名稱也可以不同,只是為了容易辨識,我們故意使用相同的名稱。
設定Button元件的click事件listener Step 3. 把在第一個步驟中建立的OnClickListener物件,設定成第二個步驟中的Button物件的click事件listener btnDoSug.setOnClickListener(btnDoSugOnClick);
程式檔的架構 public class Main extends Activity { private Button btnDoSug; private EditText edtSex, edtAge; private TextView txtResult; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 從資源類別R中取得介面元件 btnDoSug = (Button)findViewById(R.id.btnDoSug); edtSex = (EditText)findViewById(R.id.edtSex); edtAge = (EditText)findViewById(R.id.edtAge); txtResult = (TextView)findViewById(R.id.txtResult); // 設定button元件的事件listener btnDoSug.setOnClickListener( btnDoSugOnClick); } private Button.OnClickListener btnDoSugOnClick = new Button.OnClickListener() { public void onClick(View v) { // 按下按鈕後要執行的程式碼 … };
取得edtSex和edtAge介面元件中的字串 可以利用EditText物件本身提供的getText()方法來取得字串,然後把字串資料轉成String型態存入一個String物件中。我們也可以利用同樣的方法取得edtAge中的字串,不過因為年齡應該是數值型態,所以我們再將得到的String物件轉成int型態的資料 String strSex = edtSex.getText().toString(); int iAge = Integer.parseInt(edtAge.getText().toString());
將結果顯示在txtResult介面元件 將程式要顯示的訊息存入一個String物件,再把該物件利用txtResult物件的setText()方法設定給它即可。 String strSug = “程式的執行結果”; txtResult.setText(strSug);
完整的Button元件的OnClickListener程式碼 private Button.OnClickListener btnDoSugOnClick = new Button.OnClickListener() { public void onClick(View v) { // 按下按鈕後要執行的程式碼 String strSex = edtSex.getText().toString(); int iAge = Integer.parseInt(edtAge.getText().toString()); String strSug = "結果:"; if (strSex.equals("男")) if (iAge < 28) strSug += "不急"; else if (iAge > 33) strSug += "趕快結婚"; else strSug += "開始找對象"; else if (iAge < 25) strSug += "不急"; else if (iAge > 30) strSug += "趕快結婚"; else strSug += "開始找對象"; txtResult.setText(strSug); } };
在模擬器中輸入中文 如果是在Android 2.X的手機模擬器上操作,用滑鼠點選任何一個EditText元件準備輸入資料時,螢幕下方就會自動出現一個虛擬鍵盤。
在模擬器中輸入中文 如果是Android 4.X的手機模擬器,當用滑鼠點選任何一個EditText元件準備輸入資料時,螢幕左下方會出現一個鍵盤圖示,我們可以用滑鼠點選它按住不放再往下拉就會出現如下圖的畫面,點選Select input method便可進入輸入法選單。 32
在模擬器中輸入中文 如果是Android 3.X/4.X的平板電腦模擬器,用滑鼠點選任何一個EditText元件準備輸入資料時,螢幕右下方會出現一個鍵盤圖示,當我們用滑鼠點選它時就會彈出輸入法選擇視窗,我們可以點選「谷歌拼音輸入法」來輸入中文,並且把最上面的Use physical keyboard項目右邊的ON按下(變成只看到OFF)。 33
手機輸入中文的方法 點選該鍵盤左下方的「中文(英文)」按鈕切換中英文輸入模式,或是利用該按鈕右邊的「符號數字」按鈕切換到符號數字鍵盤。Android手機的中文輸入是使用「谷歌拼音」,也就是所謂的「漢語拼音」,它是利用26個英文字母代替注音符號,詳細的對照表可以到下列網址查詢。 http://www.cccla-us.org/pinyin.htm
單元7 程式的錯誤類型和除錯方法
程式的錯誤類型 語法錯誤 程式碼不符合程式語言的語法 邏輯錯誤 程式已經可以執行,只是執行的結果不對。例如要計算輸入的成績總分,但是加總的結果不對。 執行時期錯誤(又稱為例外) 程式在執行過程中彈出非預期的終止訊息就表示出現執行時期錯誤。
程式的語法錯誤和除錯的方法 語法錯誤是最明顯也是最容易解決的錯誤類型,目前許多程式碼編輯器都有即時檢查語法的功能,只要有錯誤就會立刻標示出來,Eclipse也是如此。 某一行程式的前面出現紅色打叉符號就表示該行有語法錯誤,在該行的某處會有紅色波浪底線,把滑鼠游標移到波浪底線上面時,會彈出一個說明視窗。
程式的邏輯錯誤和除錯的方法 遇到這種錯誤我們可以採取下列步驟: Step 1. 首先思考可能在哪一段程式碼出錯。 Step 2. 在可能出錯的程式碼的第一行設定一個中斷點。所謂中斷點就是當程式在除錯模式下,執行到該處就會暫停。設定中斷點的方式是點選Eclipse上方選單的「Run > Toggle Breakpoint」就會在目前編輯游標所在的那一行程式碼標示一個中斷點,也就是那一行的最前面會出現一個小圓點。要取消中斷點時,直接在小圓點上按二下即可。 提示:我們同樣可以在小圓點出現的地方用滑鼠左鍵快按二下來設定中斷點。
程式的邏輯錯誤和除錯的方法 Step 3. 點選工具列上的小蟲按鈕(稱為Debug按鈕),讓程式以除錯模式執行。 Step 4. 操作程式讓程式進入設定中斷點的程式碼,當程式執行到中斷點時會彈出一個訊息視窗,通知我們即將切換到除錯畫面,這時候請按下Yes按鈕。
程式的邏輯錯誤和除錯的方法 Step 5. Eclipse切換到除錯(Debug)畫面。 左邊中央的視窗就是程式碼視窗,在中斷點那一行前面會有一個箭頭表示目前程式正要執行該行。畫面的右上方視窗則會列出程式中的變數,我們可以看到每一個變數的值,也可以點一下某一個變數的值然後將它修改,程式就會用修改後的值繼續執行。 主要工具列的下方(也就是Debug視窗的上方)有一個除錯工具列可以控制程式的執行
程式的邏輯錯誤和除錯的方法 Step 6. 要終止除錯模式時,先用滑鼠點選左上方Debug視窗中的程式專案名稱,然後按下除錯工具列上的停止按鈕,最後再按一下主工具列最右邊的「Java」按鈕就會回到原來的程式編輯畫面。
執行時期錯誤和除錯的方法 找出發生執行時期錯誤的原因也可以利用前面介紹的設定中斷點的方式,或是利用以下介紹的log方法來除錯。
執行時期錯誤和除錯的方法 要讓程式產生log必須先在程式前面import以下套件 然後再使用以下指令 import android.util.*; 然後再使用以下指令 Log.d(“這個log訊息的分類標籤”, “訊息”); 每一個log都可以設定一個標籤以方便分類和搜尋,但是目前log只能使用英文,因為中文會顯示亂碼。
執行時期錯誤和除錯的方法 Android作業系統在執行的過程中會自動產生許多log訊息(在除錯模式右下方的LogCat視窗中),為了能夠找出我們的程式所產生的log,我們可以把程式名稱當成是log的標籤,為了過濾出我們程式所產生的log,可以點選LogCat視窗上方工具列中的「+」按鈕,然後在出現的Log Filter對話盒中輸入filter名稱,在by Log Tab欄位輸入要查看的標籤名稱,在LogCat視窗中就會列出我們的程式的所有log訊息。
log方法和中斷點方法互相配合使用 舉例來說,如果是在程式執行迴圈的過程中發生錯誤,可以先在迴圈中加上log。因為如果迴圈執行的次數很多,一步一步追蹤程式碼非常耗時,我們先利用log找出究竟是哪一次迴圈造成錯誤,再利用設定中斷點的方法來追蹤那一次迴圈的執行過程就可以比較快地找出錯誤的原因。 45