Chapter 1: Introduction

Similar documents
多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

Android Fragment

Android Service

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Dynamic Layout in Android

Chapter 1: Introduction

新・解きながら学ぶJava

RecyclerView and CardVew

The golden pins of the PCI card can be oxidized after months or years

(Microsoft Word - wes _\246p\246\363\250\317\245\316LED\277O\305\343\245\334\252\254\272A.doc)

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

Microsoft Word - 01.DOC

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

0511-Android程式之GPS應用_專題週記4

建立Android新專案

Microsoft Word - 02.目錄.doc

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

PowerPoint Presentation


Android Android Android SDK iv

untitled

PowerPoint 簡報

建模与图形思考

ShareText

Android 编程基础 Android 开发教程 & 笔记 1

Android + NFC

Java

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

ContextMenu

第三篇 第 10 章 - 管理者登入第 11 章 - 更改網路商店 Logo 第 12 章 - 系統設定第 13 章 - 商品上架第 14 章 - 付款方式設定第 15 章 - 出貨方式設定第 16 章 - 特價商品 oscommerce 103

目 錄 一 ANDROID 開發系統需求 作業系統 開發工具... 1 二 安裝 ANDROID 開發工具 安裝 JDK 使用 APT-GET 安裝 使用套件管理程式安裝... 9 三 ANDROID 程式撰寫... 1

建立Android新專案

投影片 1

Microsoft Word - ACL 作者序

PowerPoint 簡報

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD

CU0594.pdf

書面

Android 开发教程

01 用 ActionScript 3.0 開始認識 Flash CS3 Flash 是應用在網路上非常流行且高互動性的多媒體技術, 由於擁有向量圖像體積小的優點, 而且 Flash Player 也很小巧精緻, 很快的有趣的 Flash 動畫透過設計師的創意紅遍了整個網際網路 雖然很多人都對 Fl

iziggi

Lecture01_Android介绍

Microsoft PowerPoint - ch6 [相容模式]

Database_001

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

Microsoft Word 杨超-spinner实现省市县的三级联动.docx

chp6.ppt

《大话设计模式》第一章

Microsoft Word - ch04三校.doc

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Microsoft PowerPoint - App與微控器整合.pptx

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

新版 明解C++入門編

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

運算子多載 Operator Overloading

Microsoft Word - 第3章.doc

A SB-5000 SB-5000 i 0A-12 i Q&A 0A-9 i 0H-31 i 0H-1 0A-16 A-18 SB-5000 Model Name: N1502 A-1

( )... 5 ( ) ( )

幻灯片 1

投影片 1

Microsoft PowerPoint - C_Structure.ppt

投影片 1

Microsoft PowerPoint - 07.Android 介面元件-TableLayout、Toast、AlertDialog

<android.support.v7.widget.recyclerview android:layout_width="0dp" android:layout_height="0dp" android:layout_marginbottom

Lecture01_Android介绍

Microsoft Word - 第4章 3D相册.doc

使用手冊

untitled

EJB-Programming-4-cn.doc

二次曲線 人們對於曲線的使用及欣賞 比曲線被視為一種數學題材來探討要早 得多 各種曲線中 在日常生活常接觸的 當然比較容易引起人們的興趣 比如 投擲籃球的路徑是拋物線 盤子的形狀有圓形或橢圓形 雙曲線 是較不常見的 然而根據科學家的研究 彗星的運行軌道是雙曲線的一部 分 我們將拋物線 圓與橢圓 雙曲

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378>

(Microsoft Word - wes _\246p\246\363\250\317\245\316watchdog\250\276\244\356\265{\246\241\267\355\276\367.doc)

CHAPTER VC#

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

Android + WebService

ActiveX Control

Microsoft Word - AEL CH05.doc

Microsoft Word - 第1章 Android基本概念.docx

Transcription:

目錄 目錄 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

XVIII Android 4.X 手機 / 平板電腦程式設計入門 應用到精通 範例 : 通訊錄程式單元 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 程式的考量 單元 單元 59 開發不同 Android 版本程式的考量 513 開發不同 Android 版本 Android 版本 1.X 2.X 3.X 4.X 適用性 Google 剛開始發表 Android 平台的時候是以智慧型手機為目標, 後來當平板電腦出現之後, 便順應趨勢加入支援平板電腦的相關技術 但是以現階段而言, Android 系統已經不再限制只能用在手機和平板電腦, 在 2011 年 5 月舉辦的 Google IO Conference 中,Google 對外公開表示, 未來 Android 的目標是成為所有智慧型裝置的核心, 例如現在正在推廣中的網路電視, 以及智慧家電像是洗衣機 電冰箱 空調系統 等 當然以目前來說, 這些智慧型家電或許還有些遙遠, Google TV 也尚未普及, 當前最熱門的 IT 產品還是手機和平板電腦, 而且這二者的特性和用途也最接近 當程式設計人員在開發 Android 應用程式的時候, 最常見的困擾是如何讓程式能夠同時適用於手機和平板電腦 這個問題牽涉到不同 Android 版本的功能支援, 還有就是如何讓程式的操作介面能夠同時適用不同螢幕尺寸的設備 平板電腦螢幕的大小通常是手機螢幕的二倍以上, 因此有些時候我們必須針對平板電腦程式採用不同的操作介面編排方式 前一個單元介紹的 res 資料夾命名技術可以用來區分手機和平板電腦的介面描述檔, 對於一些程式而言這個方法已經可以滿足它們的需要, 但是有些情況可能還要更複雜一些 舉例來說, 如果手機程式因為螢幕太小必須將操作介面分成二頁來顯示, 像是我們前面的 電腦猜拳遊戲 範例, 必須將遊戲畫面和局數統計資料分開顯示 如果換成在平板電腦上執行, 就可以讓遊戲畫面和局數統計資料同時顯示, 這種情況就不是單純使用 res 資料夾命名技術就能夠解決, 因為它還牽涉到程式碼運作流程的改變, 在手機上必須切換畫面, 但是在平板電腦執行時就不用 根據以上的討論, 讀者應該能夠體會要開發同時適用多種 Android 平台版本和不同螢幕尺寸的程式並不是一個單純的問題 對於操作介面比較簡單的程式來說也許很容易, 可是如果程式的操作介面比較複雜, 那麼就需要使用一些程式設計的技巧 為了讓讀者有基本的法則可以遵循, 筆者特別整理出一個樹狀的決策流程如圖 59-1 首先第一個要考量的問題就是程式有沒有需要在不同的 Android 平台上執行, 如果只是一個學校的程式作業, 或是單純自己用來研究實驗的程式, 就不需要

514 Part 11 程式專案的整備工作和發佈 考量不同 Android 平台的適用問題, 只要依照自己的需求選定一個 Android 平台, 然後在上面開發程式即可 但是如果要將開發的程式公佈在網路上讓世界各地的人下載, 就必須謹慎考慮如何處理多種不同 Android 平台和螢幕尺寸的問題 我們可以利用前一個單元介紹的資源資料夾命名技術, 或是本單元隨後介紹的 Fragment 技巧, 讓程式的操作介面能夠適應不同裝置的螢幕大小 另外也可以藉由限制程式可以安裝的 Android 平台版本和裝置螢幕尺寸, 這一個部分留待下一個單元再作介紹 圖 59-1 開發同時適用多種 Android 平台版本和不同螢幕尺寸程式的決策流程圖

單元 59 開發不同 Android 版本程式的考量 515 59-1 利用 Fragment 控制分頁或單頁顯示 有關 Fragment 的用法我們已經在單元二十五到二十八中介紹過, 包括最基本的靜態 Fragment 和利用程式碼動態顯示和隱藏 Fragment 如果程式的操作畫面包含比較多的元件, 那麼有可能在手機螢幕上必須將操作畫面分成二頁顯示, 但是如果換成在平板電腦上執行就可以用單頁顯示, 這個問題可以利用動態 Fragment 的技巧解決, 也就是單元二十八的範例程式中的 Fragment 控制技術以及 callback 函式, 但是程式的架構不需要像該範例那麼複雜, 或者可以說是單元二十八範例程式的簡化版 讀者可以回頭參考單元二十八的範例程式, 它在執行的過程中, 使用者可以隨意控制 局數統計畫面 的顯示和隱藏, 而且為了示範完整的動態 Fragment 控制技巧, 我們還特別實作了二種 局數統計畫面, 並且加上 Back Stack 的功能 如果只是要利用 Fragment 讓程式能夠依照螢幕尺寸, 控制操作畫面的單頁或分頁顯示, 並不需要用到單元二十八範例程式這麼複雜的技巧, 只要在程式啟動時檢查螢幕大小, 然後決定要顯示的 Fragment 數目即可, 接著在程式執行的過程中, 再依照使用者的操作適當地變換 Fragment 以下我們以單元二十八的 電腦猜拳遊戲 為例, 將它修改成能夠依照螢幕尺寸自動調整 Fragment 的顯示個數, 請讀者依照以下步驟操作 : 執行檔案總管, 複製單元二十八的 電腦猜拳遊戲 範例程式的專案資料夾, 複製後可以重新命名 利用 Eclipse 主選單的 File > Import 功能載入上一個步驟複製的程式專案 在 Eclipse 左邊的專案檢視視窗中展開 res/layout 資料夾, 開啟其中的介面佈局檔 main.xml 原來的程式介面是直接建立一個 fragment 元件用來顯示遊戲畫面, 再利用一個 FrameLayout 元件用來動態載入 局數統計畫面 的 fragment 現在我們要將其中的 fragment 元件也改成使用 FrameLayout, 也就是說程式畫面中有二個 FrameLayout 元件, 這樣我們就可以利用程式碼控制每一個 FrameLayout 中顯示的 Fragment 當程式在平板電腦上執行時, 會同時顯示這二個 FrameLayout 元件, 並將遊

516 Part 11 程式專案的整備工作和發佈 戲程式的 Fragment 放在第一個 FrameLayout, 局數統計畫面 的 fragment 則顯示在第二個 FrameLayout 如果程式是在手機上執行, 同 樣會將遊戲程式的 Fragment 放在第一個 FrameLayout, 局數統計畫 面 的 fragment 顯示在第二個 FrameLayout, 但剛開始只會顯示第一個 FrameLayout, 並將第二個 FrameLayout 隱藏 等到使用者按下 顯示 結果 按鈕時, 再將第一個 FrameLayout 隱藏, 換成顯示第二個 FrameLayout, 以下是修改後的介面佈局檔 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingleft="30dp" android:paddingright="30dp" android:paddingtop="10dp" > <FrameLayout android:id="@+id/frame1" android:layout_weight="1" android:layout_width="0px" android:layout_height="wrap_content" /> <FrameLayout android:id="@+id/frame2" android:layout_weight="1" android:layout_width="0px" android:layout_height="wrap_content" android:background="?android:attr/detailselementbackground" /> </LinearLayout> 在 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)

518 Part 11 程式專案的整備工作和發佈 { 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 的顯示狀態, 也就是隱藏遊戲程式換成顯示局數統計畫面

520 Part 11 程式專案的整備工作和發佈 以下列出相關的程式碼 : 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);

522 Part 11 程式專案的整備工作和發佈 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 並修改按鈕如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="400dp" android:layout_height="match_parent" android:layout_gravity="center_horizontal" > ( 和原來專案的程式碼相同 ) <TextView android:id="@+id/txtresult" android:layout_width="wrap_content"

單元 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" /> <Button android:id="@+id/btnshowresult" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btnshowresult" android:layout_below="@id/txtresult" android:layout_centerhorizontal="true" android:textsize="20sp" android:layout_margintop="10dp" /> </RelativeLayout> 開啟 局數統計畫面 的介面佈局檔 game_result.xml, 在最後新增一個 回到遊戲 的按鈕 當程式只顯示單一 FrameLayout 時使用者可以按 下這個按鈕回到遊戲畫面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > ( 和原來專案的程式碼相同 ) <Button android:id="@+id/btnbacktogame" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="@string/btnbacktogame" android:textsize="20sp" /> </LinearLayout>

524 Part 11 程式專案的整備工作和發佈 開啟 局數統計畫面 的程式檔 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

526 Part 11 程式專案的整備工作和發佈 圖 59-2 程式在平板電腦執行時會同時顯示遊戲畫面和局數統計畫面 圖 59-3 程式在手機上執行時只會顯示遊戲畫面, 使用者必須利用畫面下方的按鈕進行切換 在這個範例中我們用到偵測螢幕大小分類的程式碼, 在開發能夠同時適用不同 Android 裝置的程式時, 螢幕的尺寸和解析度是很重要的考量, 因為它會影響程式介面的編排, 下一個單元我們將繼續介紹如何在程式中偵測螢幕的實際寬度 高度和解析度