參考資料: 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的話, 可以透過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章 使用者介面設計 完結!)
沒有留言:
張貼留言