網頁

2010年12月11日 星期六

Android: 讀書心得 #4 對話盒 除錯 退出程式

接續上篇: 花栗鼠柑仔店: Android筆記: 讀書心得#3

參考資料: Amazon.com: Hello, Android: Introducing Google's Mobile Development Platform (Pragmatic Programmers) (9781934356562): Ed Burnette: Books

這段內容主要為:
第3章 使用者介面設計
20. 開始新遊戲對話盒
21. 除錯 (Debugging)
22. 退出遊戲

第3章: 使用者介面設計 (Designing the User Interface)

20. 開始新遊戲對話盒
一般Sudoku開始新遊戲都會讓使用者選擇遊戲難易度, 這邊示範如何在使用者點選New Game時, 跳出一個對話盒選難度, 先定義幾個會用到的變數:

## res/values/strings.xml
<string name="new_game_title">Difficulty</string>
<string name="easy_label">Easy</string>
<string name="medium_label">Medium</string>
<string name="hard_label">Hard</string>

將難易度選擇的變數建成一個陣列資源(array resource), 放在res/values/arrays.xml, 新增一個xml檔後, 填入底下的資料:

## res/values/arrays.xml
<resources>
  <array name="difficulty">
    <item>@string/easy_label</item>
    <item>@string/medium_label</item>
    <item>@string/hard_label</item>
    </array>
</resources>

再來修改主程式Sudoku.java把一些需要匯入的函示庫加入:

## src/org/example/sudoku/Sudoku.java
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.util.Log;

先前在主程式中我們已經加好onClick( )的事件處理, 這邊再增加一個讓使用者按下New Game時可以啟動一個對話盒詢問遊戲難度.

## src/org/example/sudoku/Sudoku.java
case R.id.new_button:

  openNewGameDialog();
  break;

利用AlertDialog類別來建構一個新的對話盒, 由於每個AlertDialog.Builder函式呼叫回傳均為Builder本身,(AlertDialog.Builder | Android Developers), 所以可以串接每個函式把對話盒給建構起來, setTitle()是設定對話盒的標題, setItems()兩個參數前面給一個array定義要顯示在銀幕可選擇的選項, 第二個參數可以給一個OnClickListener監視按下哪一個按鈕, 按下後對應要執行什麼動作, 最後加上show()把對話盒給顯示出來.

## src/org/example/sudoku/Sudoku.java
private static final String TAG = "Sudoku" ;

private void openNewGameDialog() {
  new AlertDialog.Builder(this)
    .setTitle(R.string.new_game_title)
    .setItems(R.array.difficulty,
  new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialoginterface, int i) {
      startGame(i);
    }
  })
  .show();
}

private void startGame(int i) {
  Log.d(TAG, "clicked on " + i);
  // Start game here...
}

執行結果:

21. Debugging
在Android中你可以用在寫其他Java程式所用到的除錯的技巧, 均是可行的, 較常用的如將一些訊息印到log中或用debugger做步進運行(stepping), 這邊說明在Android系統提供一個輔助除錯類別android.util.Log. Log類別提供了多個靜態的方法可以將訊息印到不同的Android系統記錄等級, 如:

  • Log.e( ): 錯誤 (Errors)
  • Log.w( ): 警告 (Warnings)
  • Log.i( ): 資訊 (Information)
  • Log.d( ): 除錯 (Debugging)
  • Log.v( ): 詳細說明 (Verbose)
  • Log.wtf( ): 嚴重的錯誤 (What a Terrible Failure, Android 2.2加入, 這邊感覺有惡搞的意味...)
一般使用者不會看到這些記錄訊息, 假如開發者想看這些訊息的話, 在Eclipse可以打開LogCat來觀看, LogCat可以選 Window->Show View->Other...->Android->LogCat就可以打開在底下記錄窗中, 這些記錄也會附上你所設定的標籤(tag)供除錯參考:


假如不使用Eclipse的話, 可以透過adb logcat這樣的命令來監視android模擬器的log輸出(在android-sdk的tools目錄中). 在模擬器啟動前執行即可, 執行結果會類似這樣(按下New Game選完難度後):


這些log的訊息非常的有用, 如之前遇到忘記把About對話盒加入到AndroidManifest.xml, 假如有開LogCat的話, 會顯示這樣的訊息: “ActivityNotFoundException: Unable to find explicit activity class...have you declared this activity in your AndroidManifest.xml?” 這再明白不過發生了什麼事情, 可以讓寫程式的過程於快很多.

除了log之外, 假如要用Eclipse debugger來設定中斷點除錯的話, 需要在AndroidManifest.xml裡面設定android:debuggable="true"讓除錯功能啟用,如下:

## AndroidManifest.xml
<application android:icon="@drawable/icon"
  android:label="@string/app_name"
  android:debuggable="true" >

接下來只要在專案上按右鍵選Debug As->Android Application這樣即可.

22. 退出遊戲在Android上使用者僅需用Back或Home鍵回到主選單做其他事情即可, 但假如真的有需要把activity給結束掉, 可以利用finish()這樣的函式呼叫結束, 所以直接在onClick()裡面加入對應的程式碼, 讓使用者按下Exit Game可以退出activity:
## src/org/example/sudoku/Sudoku.java
case R.id.exit_button:
  finish();
  break;


(第3章 使用者介面設計 完結!)

沒有留言:

張貼留言