part 1 androidepaper.gotop.com.tw/pdfsample/ael012200.pdf ·...

17
目錄IX 錄 Part 1 擁抱 Android 單元 01 Android 造時勢或是時勢造 Android ......................................... 2 Android 從何而來............................................................................. 3 Android 的功能、應用和商機 ........................................................... 5 先睹為快 - Android 手機和平板電腦模擬器 ....................................... 7 單元 02 安裝 Android 程式開發工具 ................................................... 10 不同作業系統的開發工具版本 ......................................................... 10 安裝 Android 程式開發工具的步驟................................................... 12 Android 程式開發工具的維護和更新 ................................................ 22 單元 03 建立 Android 應用程式專案 ................................................... 25 修改程式的介面 .............................................................................. 29 範例:第一個 Android 應用程式專案 單元 04 Eclipse 程式專案管理技巧 ..................................................... 32 根據已經寫好的程式檔來建立專案 .................................................. 32 根據 Android SDK 中的程式範例來建立專案 .................................... 33 把建立好的 Android 程式專案載入 Eclipse....................................... 34 程式專案的管理和維護 .................................................................... 35 Part 2 開發 Android 應用程式的流程 單元 05 瞭解 Android 程式專案的架構和查詢 SDK 說明文件 .............. 40 單元 06 使用 TextViewEditText Button 介面元件 ......................... 46 TextView 介面元件 .......................................................................... 46 EditText 介面元件 ........................................................................... 48 Button 介面元件.............................................................................. 49

Upload: others

Post on 13-Jun-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

  • 目錄│

    IX 目 錄

    Part 1 擁抱 Android 單元 01 Android 造時勢或是時勢造 Android......................................... 2

    Android 從何而來 ............................................................................. 3

    Android 的功能、應用和商機 ........................................................... 5

    先睹為快 - Android 手機和平板電腦模擬器 ....................................... 7

    單元 02 安裝 Android 程式開發工具 ................................................... 10

    不同作業系統的開發工具版本 .........................................................10

    安裝 Android 程式開發工具的步驟...................................................12

    Android 程式開發工具的維護和更新 ................................................22

    單元 03 建立 Android 應用程式專案 ................................................... 25

    修改程式的介面 ..............................................................................29

    範例:第一個 Android 應用程式專案

    單元 04 Eclipse 程式專案管理技巧 ..................................................... 32

    根據已經寫好的程式檔來建立專案 ..................................................32

    根據 Android SDK 中的程式範例來建立專案 ....................................33

    把建立好的 Android 程式專案載入 Eclipse.......................................34

    程式專案的管理和維護 ....................................................................35

    Part 2 開發 Android 應用程式的流程 單元 05 瞭解 Android 程式專案的架構和查詢 SDK 說明文件 .............. 40

    單元 06 使用 TextView、EditText 和 Button 介面元件 ......................... 46

    TextView 介面元件 ..........................................................................46

    EditText 介面元件 ...........................................................................48

    Button 介面元件 ..............................................................................49

  • │Android 4.X 手機/平板電腦程式設計入門、應用到精通

    XVIII

    範例:通訊錄程式

    單元 57 使用檔案儲存資料 ................................................................497

    將資料寫入檔案的方法 ..................................................................497

    從檔案讀取資料的方法 ..................................................................498

    範例程式 ......................................................................................500

    範例:讀寫檔案程式

    Part 11 程式專案的整備工作和發佈 單元 58 支援多語系和螢幕模式 .........................................................506

    讓程式支援多語系的方法 ..............................................................507

    讓程式支援多種螢幕模式 ..............................................................508

    範例程式 ......................................................................................509

    範例:同時支援多語系和螢幕模式的程式

    單元 59 開發不同 Android 版本程式的考量 .......................................513

    利用 Fragment 控制分頁或單頁顯示 ..............................................515

    範例:使用 Fragment 開發同時適用手機和平板電腦的程式

    單元 60 取得螢幕的寬度、高度和解析度 ...........................................527

    取得螢幕的寬高和解析度 ..............................................................527

    取得程式畫面的寬和高 ..................................................................528

    利用 AndroidManifest.xml 檔設定程式執行的螢幕條件 ...................534

    範例:利用程式碼取得螢幕的寬高和解析度

    單元 61 將程式安裝到實體裝置或在網路上發佈 ................................538

    利用 Export Wizard 幫程式加上數位簽名和完成 zipalign ................539

    將程式上傳到 Google 的 Android Market 網站 ...............................542

    Part 12 2D 和 3D 繪圖 單元 62 使用 Drawable 物件 ..............................................................544

    從 res/drawable 資料夾的影像檔建立 Drawable 物件 .....................544

  • 目錄│

    XIX

    在 res/drawable 資料夾中建立 xml 檔案格式的 Drawable物件定義檔 ..545

    在程式中建立 Drawable 型態的物件 ..............................................547

    範例程式 ......................................................................................547

    範例:使用 Drawable 物件的繪圖程式

    單元 63 使用 Canvas 繪圖 .................................................................551

    範例:使用 Canvas 的繪圖程式

    單元 64 使用 View 在 Canvas 上繪製動畫 .........................................555

    程式繪製動畫的原理 .....................................................................555

    範例程式 ......................................................................................556

    範例:繪製橢圓形動畫

    單元 65 使用 SurfaceView 進行高速繪圖 ...........................................561

    使用 SurfaceView 的步驟...............................................................561

    範例程式 ......................................................................................563

    範例:繪製橢圓形動畫

    單元 66 3D 繪圖 ................................................................................568

    3D 繪圖的基本觀念 .......................................................................568

    3D 繪圖程式 .................................................................................570

    範例:旋轉立體三角錐

    Part 13 Google 地圖程式 單元 67 使用 Google 地圖 .................................................................578

    開發 Google 地圖應用程式的準備工作 ..........................................578

    建立 Google 地圖應用程式的步驟 .................................................583

    範例程式 ......................................................................................585

    範例:基本 Google 地圖程式

    單元 68 Google 地圖的進階用法 .......................................................590

    地圖的縮放和拖曳功能 ..................................................................590

    加上鍵盤控制功能 .........................................................................592

  • 單元 59 開發不同 Android 版本程式的考量│

    513

    Google 剛開始發表 Android 平台的時候是以智慧型手機為目標,後來當平板

    電腦出現之後,便順應趨勢加入支援平板電腦的相關技術。但是以現階段而言,

    Android 系統已經不再限制只能用在手機和平板電腦,在 2011 年 5 月舉辦的

    Google IO Conference 中,Google 對外公開表示,未來 Android 的目標是成為所

    有智慧型裝置的核心,例如現在正在推廣中的網路電視,以及智慧家電像是洗衣

    機、電冰箱、空調系統…等。當然以目前來說,這些智慧型家電或許還有些遙遠,

    Google TV 也尚未普及,當前最熱門的 IT 產品還是手機和平板電腦,而且這二者的

    特性和用途也最接近。當程式設計人員在開發 Android 應用程式的時候,最常見的

    困擾是如何讓程式能夠同時適用於手機和平板電腦。這個問題牽涉到不同 Android

    版本的功能支援,還有就是如何讓程式的操作介面能夠同時適用不同螢幕尺寸的

    設備。

    平板電腦螢幕的大小通常是手機螢幕的二倍以上,因此有些時候我們必須針對

    平板電腦程式採用不同的操作介面編排方式。前一個單元介紹的 res 資料夾命名技

    術可以用來區分手機和平板電腦的介面描述檔,對於一些程式而言這個方法已經可

    以滿足它們的需要,但是有些情況可能還要更複雜一些。舉例來說,如果手機程式

    因為螢幕太小必須將操作介面分成二頁來顯示,像是我們前面的「電腦猜拳遊戲」

    範例,必須將遊戲畫面和局數統計資料分開顯示。如果換成在平板電腦上執行,就

    可以讓遊戲畫面和局數統計資料同時顯示,這種情況就不是單純使用 res 資料夾命

    名技術就能夠解決,因為它還牽涉到程式碼運作流程的改變,在手機上必須切換畫

    面,但是在平板電腦執行時就不用。

    根據以上的討論,讀者應該能夠體會要開發同時適用多種 Android 平台版本和

    不同螢幕尺寸的程式並不是一個單純的問題。對於操作介面比較簡單的程式來說也

    許很容易,可是如果程式的操作介面比較複雜,那麼就需要使用一些程式設計的技

    巧。為了讓讀者有基本的法則可以遵循,筆者特別整理出一個樹狀的決策流程如圖

    59-1。首先第一個要考量的問題就是程式有沒有需要在不同的 Android 平台上執

    行,如果只是一個學校的程式作業,或是單純自己用來研究實驗的程式,就不需要

    開發不同 Android 版本 程式的考量

    59 Android 版本 1.X 2.X 3.X 4.X

    適用性 ★ ★

    單 元

  • │ Part 11 程式專案的整備工作和發佈

    514

    考量不同 Android 平台的適用問題,只要依照自己的需求選定一個 Android 平台,

    然後在上面開發程式即可。但是如果要將開發的程式公佈在網路上讓世界各地的人

    下載,就必須謹慎考慮如何處理多種不同 Android 平台和螢幕尺寸的問題。我們可

    以利用前一個單元介紹的資源資料夾命名技術,或是本單元隨後介紹的 Fragment

    技巧,讓程式的操作介面能夠適應不同裝置的螢幕大小。另外也可以藉由限制程式

    可以安裝的 Android 平台版本和裝置螢幕尺寸,這一個部分留待下一個單元再作

    介紹。

    圖 59-1 開發同時適用多種 Android 平台版本和不同螢幕尺寸程式的決策流程圖

  • 單元 59 開發不同 Android 版本程式的考量│

    515

    59-1 利用Fragment控制分頁或單頁顯示 ragment控制分頁或單頁顯示 有關 Fragment 的用法我們已經在單元二十五到二十八中介紹過,包括最基本

    的靜態 Fragment 和利用程式碼動態顯示和隱藏 Fragment。如果程式的操作畫面包

    含比較多的元件,那麼有可能在手機螢幕上必須將操作畫面分成二頁顯示,但是如

    果換成在平板電腦上執行就可以用單頁顯示,這個問題可以利用動態 Fragment 的

    技巧解決,也就是單元二十八的範例程式中的 Fragment 控制技術以及 callback 函

    式,但是程式的架構不需要像該範例那麼複雜,或者可以說是單元二十八範例程式

    的簡化版。

    有關 Fragment 的用法我們已經在單元二十五到二十八中介紹過,包括最基本

    的靜態 Fragment 和利用程式碼動態顯示和隱藏 Fragment。如果程式的操作畫面包

    含比較多的元件,那麼有可能在手機螢幕上必須將操作畫面分成二頁顯示,但是如

    果換成在平板電腦上執行就可以用單頁顯示,這個問題可以利用動態 Fragment 的

    技巧解決,也就是單元二十八的範例程式中的 Fragment 控制技術以及 callback 函

    式,但是程式的架構不需要像該範例那麼複雜,或者可以說是單元二十八範例程式

    的簡化版。

    讀者可以回頭參考單元二十八的範例程式,它在執行的過程中,使用者可以隨

    意控制「局數統計畫面」的顯示和隱藏,而且為了示範完整的動態 Fragment 控制

    技巧,我們還特別實作了二種「局數統計畫面」,並且加上 Back Stack 的功能。

    如果只是要利用 Fragment 讓程式能夠依照螢幕尺寸,控制操作畫面的單頁或分頁

    顯示,並不需要用到單元二十八範例程式這麼複雜的技巧,只要在程式啟動時檢查

    螢幕大小,然後決定要顯示的 Fragment 數目即可,接著在程式執行的過程中,再

    依照使用者的操作適當地變換 Fragment。以下我們以單元二十八的「電腦猜拳遊

    戲」為例,將它修改成能夠依照螢幕尺寸自動調整 Fragment 的顯示個數,請讀者

    依照以下步驟操作:

    讀者可以回頭參考單元二十八的範例程式,它在執行的過程中,使用者可以隨

    意控制「局數統計畫面」的顯示和隱藏,而且為了示範完整的動態 Fragment 控制

    技巧,我們還特別實作了二種「局數統計畫面」,並且加上 Back Stack 的功能。

    如果只是要利用 Fragment 讓程式能夠依照螢幕尺寸,控制操作畫面的單頁或分頁

    顯示,並不需要用到單元二十八範例程式這麼複雜的技巧,只要在程式啟動時檢查

    螢幕大小,然後決定要顯示的 Fragment 數目即可,接著在程式執行的過程中,再

    依照使用者的操作適當地變換 Fragment。以下我們以單元二十八的「電腦猜拳遊

    戲」為例,將它修改成能夠依照螢幕尺寸自動調整 Fragment 的顯示個數,請讀者

    依照以下步驟操作:

    執行檔案總管,複製單元二十八的「電腦猜拳遊戲」範例程式的專案資

    料夾,複製後可以重新命名。

    利用 Eclipse 主選單的 File > Import 功能載入上一個步驟複製的程式

    專案。

    在 Eclipse 左邊的專案檢視視窗中展開 res/layout 資料夾,開啟其中的介

    面佈局檔 main.xml。原來的程式介面是直接建立一個 fragment 元件用來

    顯示遊戲畫面,再利用一個 FrameLayout 元件用來動態載入「局數統計

    畫面」的 fragment。現在我們要將其中的 fragment 元件也改成使用

    FrameLayout,也就是說程式畫面中有二個 FrameLayout 元件,這樣我

    們就可以利用程式碼控制每一個 FrameLayout 中顯示的 Fragment。當程

    式在平板電腦上執行時,會同時顯示這二個 FrameLayout 元件,並將遊

  • │ Part 11 程式專案的整備工作和發佈

    516

    戲程式的 Fragment 放在第一個 FrameLayout,「局數統計畫面」的

    fragment 則顯示在第二個 FrameLayout。如果程式是在手機上執行,同

    樣會將遊戲程式的 Fragment 放在第一個 FrameLayout,「局數統計畫

    面」的 fragment 顯示在第二個 FrameLayout,但剛開始只會顯示第一個

    FrameLayout,並將第二個 FrameLayout 隱藏。等到使用者按下「顯示

    結果」按鈕時,再將第一個 FrameLayout 隱藏,換成顯示第二個

    FrameLayout,以下是修改後的介面佈局檔:

    在 Eclipse 左邊的專案檢視視窗中展開 src/(套件路徑名稱)資料夾,開啟

    其中的主程式檔 Main.java。原來的程式是利用 GameFragment 類別中定

    義的 CallbackInterface 介面讓遊戲程式(也就是 GameFragment)能夠

    通知更新後的局數統計資料,這裡我們還是繼續採用這種作法。當主程

    式開始執行時,我們呼叫 getResources()方法取得 Resource 物件,再呼

    叫 Resou rce 物件的 getConfiguration()方法取得 Configuration 物件,然

    後利用位元 mask 的運算檢查 screenLayout 屬性,以取得螢幕大小的分

  • 單元 59 開發不同 Android 版本程式的考量│

    517

    類。如果螢幕是屬於 xlarge 類別(也就是平板電腦的螢幕),就將

    UITypeFlag 設 定 為 TWO_FRAMES 讓 後 續 的 程 式 同 時 顯 示 二 個

    fragment,如果螢幕是屬於 small、normal 或 large 類別(也就是手機螢

    幕),則將 UITypeFlag 設定為 ONE_FRAME 讓後續的程式只顯示一個

    fragment。

    在 onResume()方法中(當程式畫面即將顯示時執行)我們先將遊戲程式

    的 fragment 和「局數統計畫面」的 fragment 分別放到二個 FrameLayout

    中,然後判斷程式畫面是否已經設定好,如果不是就依照 UITypeFlag 中

    的 值 決 定 是 要 同 時 顯 示 二 個 FrameLayout 或 是 只 顯 示 第 一 個

    FrameLayout,另外我們也不再需要 enableGameResult()這個方法,修

    改後的程式碼如下:

    package ... import ... public class Main extends Activity implements GameFragment. CallbackInterface { private GameFragment fragGame; private GameResultFragment fragGameResult; private boolean bUISettedOK = false; enum UIType { ONE_FRAME, TWO_FRAMES; } public UIType UITypeFlag; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 取得裝置螢幕的大小的分類

    switch (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK)

  • │ Part 11 程式專案的整備工作和發佈

    518

    { case Configuration.SCREENLAYOUT_SIZE_SMALL: UITypeFlag = UIType.ONE_FRAME; break; case Configuration.SCREENLAYOUT_SIZE_NORMAL: UITypeFlag = UIType.ONE_FRAME; break; case Configuration.SCREENLAYOUT_SIZE_LARGE: UITypeFlag = UIType.ONE_FRAME; break; case Configuration.SCREENLAYOUT_SIZE_XLARGE: UITypeFlag = UIType.TWO_FRAMES; break; } fragGame = new GameFragment(); fragGameResult = new GameResultFragment(); } @Override protected void onResume() { // TODO Auto-generated method stub FragmentTransaction fragTran = getFragmentManager(). beginTransaction(); fragTran.replace(R.id.frame1, fragGame, "Game"); fragTran.replace(R.id.frame2, fragGameResult, "Game Result"); fragTran.commit(); if (bUISettedOK == false) { bUISettedOK = true; switch (UITypeFlag) { case ONE_FRAME: findViewById(R.id.frame1).setVisibility (View.VISIBLE); findViewById(R.id.frame2).setVisibility (View.GONE); break; case TWO_FRAMES: findViewById(R.id.frame1).setVisibility (View.VISIBLE); findViewById(R.id.frame2).setVisibility

  • 單元 59 開發不同 Android 版本程式的考量│

    519

    (View.VISIBLE); break; } } super.onResume(); } @Override public void updateGameResult(int iCountSet, int iCountPlayerWin, int iCountComWin, int iCountDraw) { // TODO Auto-generated method stub if (findViewById(R.id.frame2).isShown()) { fragGameResult.updateGameResult(iCountSet, iCountPlayerWin, iCountComWin, iCountDraw); } } }

    開啟遊戲程式檔 GameFragment.java 並依照下列項目修改:

    1. 刪除介面 CallbackInterface 中的 enableGameResult()方法,因為我們

    不再讓使用者直接控制局數統計資料的顯示和隱藏。另外也只提供一

    種局數統計資料畫面,因此刪除 GameResultType 的定義。

    2. 程式中使用的 Button 數目也會隨著操作的簡化而減少(參考下一個

    步驟的介面佈局檔的內容)。

    3. 介面佈局檔中的「顯示結果」按鈕必須隨著 FrameLayout 顯示的數目

    而改變,當二個 FrameLayout 都顯示時,「顯示結果」按鈕就要隱

    藏,因為局數統計畫面已經顯示在螢幕上(在平板電腦上執行時),

    如果只有顯示一個 FrameLayout,「顯示結果」按鈕就要啟動(在手

    機上執行時)。

    4. 當在手機上執行時,如果使用者按下「顯示結果」按鈕,程式必須切

    換二個 FrameLayout 的顯示狀態,也就是隱藏遊戲程式換成顯示局數

    統計畫面。

  • │ Part 11 程式專案的整備工作和發佈

    520

    以下列出相關的程式碼:

    package ... import ... public class GameFragment extends Fragment { // 所屬的 Activity 必須實作以下介面中的 Callback 方法

    public interface CallbackInterface { public void updateGameResult(int iCountSet, int iCountPlayerWin, int iCountComWin, int iCountDraw); }; private CallbackInterface mCallback; private Button mBtnScissors, mBtnStone, mBtnNet, mBtnShowResult; private TextView mTxtComPlay, mTxtResult; private int miCountSet = 0,

    miCountPlayerWin = 0, miCountComWin = 0, miCountDraw = 0;

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.game, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState);

  • 單元 59 開發不同 Android 版本程式的考量│

    521

    setupViewComponent(); } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); try { mCallback = (CallbackInterface) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + "must implement GameFragment.CallbackInterface."); } } private void setupViewComponent() { mTxtComPlay = (TextView)getView().findViewById(R.id.txtComPlay); mTxtResult = (TextView)getView().findViewById(R.id.txtResult); mBtnScissors = (Button)getView().findViewById(R.id.btnScissors); mBtnStone = (Button)getView().findViewById(R.id.btnStone); mBtnNet = (Button)getView().findViewById(R.id.btnNet); mBtnShowResult = (Button)getView().findViewById(R.id.btnShowResult); mBtnScissors.setOnClickListener(btnScissorsLin); mBtnStone.setOnClickListener(btnStoneLin); mBtnNet.setOnClickListener(btnNetLin); mBtnShowResult.setOnClickListener(btnShowResultLin); if (((Main)getActivity()).UITypeFlag == Main.UIType. TWO_FRAMES) { mBtnShowResult.setVisibility(View.GONE); } else { mBtnShowResult.setVisibility(View.VISIBLE); } } private Button.OnClickListener btnShowResultLin = new Button. OnClickListener() { public void onClick(View v) { getActivity().findViewById(R.id.frame1).setVisibility (View.GONE);

  • │ Part 11 程式專案的整備工作和發佈

    522

    getActivity().findViewById(R.id.frame2).setVisibility (View.VISIBLE); mCallback.updateGameResult(miCountSet, miCountPlayerWin, miCountComWin, miCountDraw); } }; private Button.OnClickListener btnScissorsLin = new Button. OnClickListener() { public void onClick(View v) { …(和原來專案的程式碼相同)

    } }; private Button.OnClickListener btnStoneLin = new Button. OnClickListener() { public void onClick(View v) { …(和原來專案的程式碼相同)

    } }; private Button.OnClickListener btnNetLin = new Button. OnClickListener() { public void onClick(View v) { …(和原來專案的程式碼相同)

    } }; }

    開啟遊戲程式的介面佈局檔 game.xml 並修改按鈕如下:

    …(和原來專案的程式碼相同)

  • 單元 59 開發不同 Android 版本程式的考量│

    523

    android:layout_height="wrap_content" android:text="@string/result" android:layout_below="@id/btnNet" android:layout_alignLeft="@id/txtCom" android:textSize="20sp" android:textColor="#0FFFFF" android:layout_marginTop="20dp" />

    開啟「局數統計畫面」的介面佈局檔 game_result.xml,在最後新增一個

    「回到遊戲」的按鈕。當程式只顯示單一 FrameLayout 時使用者可以按

    下這個按鈕回到遊戲畫面。

    …(和原來專案的程式碼相同)

  • │ Part 11 程式專案的整備工作和發佈

    524

    開啟「局數統計畫面」的程式檔 GameResultFragment.java,在程式碼

    中加入對「回到遊戲」按鈕的控制如下,這個按鈕的控制方式和前面步

    驟討論過的「顯示結果」按鈕類似:

    package ... import ... public class GameResultFragment extends Fragment { private TextView mEdtCountSet,

    mEdtCountPlayerWin, mEdtCountComWin, mEdtCountDraw;

    private Button mBtnBackToGame; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.game_result, container, false); } @Override public void onResume() { // TODO Auto-generated method stub super.onResume(); mEdtCountSet = (EditText)getActivity().findViewById (R.id.edtCountSet); mEdtCountPlayerWin = (EditText)getActivity().findViewById (R.id.edtCountPlayerWin); mEdtCountComWin = (EditText)getActivity().findViewById (R.id.edtCountComWin); mEdtCountDraw = (EditText)getActivity().findViewById (R.id.edtCountDraw); mBtnBackToGame = (Button)getActivity().findViewById (R.id.btnBackToGame); mBtnBackToGame.setOnClickListener(btnBackToGameLin);

  • 單元 59 開發不同 Android 版本程式的考量│

    525

    if (((Main)getActivity()).UITypeFlag == Main.UIType. TWO_FRAMES) { mBtnBackToGame.setVisibility(View.GONE); } else { mBtnBackToGame.setVisibility(View.VISIBLE); } } private Button.OnClickListener btnBackToGameLin = new Button. OnClickListener() { public void onClick(View v) { getActivity().findViewById(R.id.frame1). setVisibility(View.VISIBLE); getActivity().findViewById(R.id.frame2). setVisibility(View.GONE); } }; public void updateGameResult(int iCountSet,

    int iCountPlayerWin, int iCountComWin, int iCountDraw) {

    mEdtCountSet.setText(new Integer(iCountSet).toString()); mEdtCountDraw.setText(new Integer(iCountDraw).toString()); mEdtCountComWin.setText(new Integer(iCountComWin).toString()); mEdtCountPlayerWin.setText(new Integer(iCountPlayerWin). toString()); } }

    完成以上修改之後可以分別在平板電腦模擬器和手機模擬器上執行程式,當在

    平板電腦執行時,程式會同時顯示遊戲畫面和局數統計畫面如圖 59-2,當在手機上

    執行時程式剛開始只會顯示遊戲畫面,使用者必須按下「顯示結果」按鈕才會切換

    到局數統計畫面如圖 59-3。

  • │ Part 11 程式專案的整備工作和發佈

    526

    圖 59-2 程式在平板電腦執行時會同時顯示遊戲畫面和局數統計畫面

    圖 59-3 程式在手機上執行時只會顯示遊戲畫面,使用者必須利用畫面下方的按鈕進行切換

    在這個範例中我們用到偵測螢幕大小分類的程式碼,在開發能夠同時適用不同

    Android 裝置的程式時,螢幕的尺寸和解析度是很重要的考量,因為它會影響程式

    介面的編排,下一個單元我們將繼續介紹如何在程式中偵測螢幕的實際寬度、高度

    和解析度。

    單 元59開發不同Android版本 程式的考量圖59-1 開發同時適用多種Android平台版本和不同螢幕尺寸程式的決策流程圖59-1 利用Fragment控制分頁或單頁顯示圖59-2 程式在平板電腦執行時會同時顯示遊戲畫面和局數統計畫面圖59-3 程式在手機上執行時只會顯示遊戲畫面,使用者必須利用畫面下方的按鈕進行切換

    p11_59_515.pdf59-1 利用Fragment控制分頁或單頁顯示

    p11_59_515.pdf59-1 利用Fragment控制分頁或單頁顯示

    /ColorImageDict > /JPEG2000ColorACSImageDict > /JPEG2000ColorImageDict > /AntiAliasGrayImages false /CropGrayImages true /GrayImageMinResolution 300 /GrayImageMinResolutionPolicy /OK /DownsampleGrayImages true /GrayImageDownsampleType /Bicubic /GrayImageResolution 300 /GrayImageDepth -1 /GrayImageMinDownsampleDepth 2 /GrayImageDownsampleThreshold 1.50000 /EncodeGrayImages true /GrayImageFilter /DCTEncode /AutoFilterGrayImages true /GrayImageAutoFilterStrategy /JPEG /GrayACSImageDict > /GrayImageDict > /JPEG2000GrayACSImageDict > /JPEG2000GrayImageDict > /AntiAliasMonoImages false /CropMonoImages true /MonoImageMinResolution 1200 /MonoImageMinResolutionPolicy /OK /DownsampleMonoImages true /MonoImageDownsampleType /Bicubic /MonoImageResolution 1200 /MonoImageDepth -1 /MonoImageDownsampleThreshold 1.50000 /EncodeMonoImages true /MonoImageFilter /CCITTFaxEncode /MonoImageDict > /AllowPSXObjects false /CheckCompliance [ /None ] /PDFX1aCheck false /PDFX3Check false /PDFXCompliantPDFOnly false /PDFXNoTrimBoxError true /PDFXTrimBoxToMediaBoxOffset [ 0.00000 0.00000 0.00000 0.00000 ] /PDFXSetBleedBoxToMediaBox true /PDFXBleedBoxToTrimBoxOffset [ 0.00000 0.00000 0.00000 0.00000 ] /PDFXOutputIntentProfile () /PDFXOutputConditionIdentifier () /PDFXOutputCondition () /PDFXRegistryName () /PDFXTrapped /False

    /CreateJDFFile false /Description > /Namespace [ (Adobe) (Common) (1.0) ] /OtherNamespaces [ > /FormElements false /GenerateStructure false /IncludeBookmarks false /IncludeHyperlinks false /IncludeInteractive false /IncludeLayers false /IncludeProfiles false /MultimediaHandling /UseObjectSettings /Namespace [ (Adobe) (CreativeSuite) (2.0) ] /PDFXOutputIntentProfileSelector /DocumentCMYK /PreserveEditing true /UntaggedCMYKHandling /LeaveUntagged /UntaggedRGBHandling /UseDocumentProfile /UseDocumentBleed false >> ]>> setdistillerparams> setpagedevice