Chapter 1: Introduction

Size: px
Start display at page:

Download "Chapter 1: Introduction"

Transcription

1 Lesson 004 App 專案管理和 Gradle 設定技巧 Android Studio 是用 Gradle 套件來管理 App 專案 Gradle 的功能非常強大, 但是這也意謂著它的用法有一定的複雜度 建立 App 專案的時候,Android Studio 會自動幫我們產生正確的 Gradle 設定 但是軟體版本會不斷地更新,Gradle 也一樣 再加上 Android Build Tools 版本的更新, 以及 Android SDK 程式庫版本的更新 這些軟體版本的更動都會影響 Gradle 的設定 如果沒有正確搭配, 建置 App 專案時就會出錯 這些錯誤常常會讓初學者覺得困惑 因此這個單元我們就來介紹如何設定 Gradle, 讓讀者知道如何排除專案建置的錯誤 不過在介紹 Gradle 以前, 我們先從專案的複製和刪除開始 4-1 App 專案管理技巧 開發 App 專案的過程中, 除了新增專案之外, 有些時候也需要複製專案或是刪除專案, 以下我們針對專案的管理作一個綜合性的介紹 1. 複製 App 專案如果想要複製目前開啟的程式專案, 可以在 Android Studio 左邊的專案檢視視窗中完成, 但是要先變更檢視模式 首先點選專案檢視視窗上方的下拉式選單 ( 參考圖 4-1), 選擇其中的 Project, 就會在專案檢視視窗中顯示完整的專案名稱 用滑鼠右鍵點選專案名稱, 從快顯功能表中選擇 Copy 然後在專案檢視視窗的空白處按下滑鼠右鍵, 再選擇 Paste, 就會出現圖 4-2 的對話盒 在 New name 欄位輸入新專案的名稱,To directory 欄位輸入新專案的儲存路徑 複製後會在這個路徑中建立一個新的資料夾, 資料夾的名稱就是 New name 欄位中的專案名稱 另外記得取消 Open copy in editor 項目, 稍後我們可以利用 Open Project 的方式開啟這個複製的 App 專案 另一 25

2 004 App 專案管理和Gradle 設定技巧個做法是利用 Windows 檔案總管複製整個 App 專案的資料夾 複製 後可以變更資料夾名稱, 然後就可以用接下來介紹的 import 方式, 開啟複製的專案 圖 4-1 變更專案檢視視窗的檢視模式 圖 4-2 複製 App 專案的對話盒 複製 App 專案的訣竅要複製 App 專案, 只要利用 Windows 檔案總管, 把專案資料夾複製一份即可 只是專案中除了程式檔和資源檔, 還有很多編譯過程產生的暫存檔, 以及開發環境的暫存檔 這些暫存檔會佔據額外的磁碟空間, 其實它們是不需要複製的 或者如果要把程式專案複製給其他人, 也不需要複製這些暫存檔 為了減少程式專案佔據的磁碟空間 可以把下列的資料夾和檔案刪除 : 26

3 1. 程式專案資料夾中的.gradle.idea 和 build 子資料夾 2. app 資料夾中的 build 子資料夾, 請特別注意,app 資料夾不能夠刪除, 只能夠刪除其中的 build 子資料夾 3. 程式專案資料夾中的.iml 檔, 這個檔案的主檔名和專案資料夾的名稱相同 如果變更專案資料夾的名稱, 會重新建立一個.iml 檔 刪除這個檔案和資料夾之後, 可以利用 Android Studio 的 Import project 功能, 重新載入 App 專案 2. 載入 (import)app 專案 開啟(open) 專案 和 載入 (import) 專案 是不同的操作 開啟專案只能夠用在 完整 的 App 專案, 也就是用 Android Studio 建立, 或是之前已經用 Android Studio 開啟過, 這種專案已經有完整的專案設定檔 載入專案則會重新產生專案設定檔 它會依照目前電腦 Android SDK 的路徑, 以及 Gradle 的版本, 重新建立專案設定檔 因此如果用 Windows 檔案總管複製的 App 專案, 或是從另一部電腦複製過來, 甚至是從網路上下載的專案, 應該用 載入 (import) 的方式開啟 載入 App 專案有二種方式 如果是在 Android Studio 操作首頁, 可以選擇 Import project (Eclipse ADT, Gradle, etc.) 如果已經開啟某一個專案, 可以選擇主選單 File > New > Import Project 3. 刪除 App 專案只要執行 Windows 檔案總管, 刪除 App 專案的資料夾即可 下次啟動 Android Stdio 的時候, 就不會在 Recent Projects 清單中出現這個專案 27

4 004 App 專案管理和Gradle 設定技巧4-2 Gradle 設定技巧 圖 4-3 專案檢視視窗 Gradle Scripts 項目的內容 新增一個 App 專案的時候, 會自動建立一個名字叫做 app 的模組 我們可以在 Android Studio 的專案檢視視窗看到 app 這個項目 ( 提示 : 請確定專案檢視視窗是在 Android 模式, 參考圖 4-1), 它就是 app 模組 app 模組下一項是 Gradle Scripts, 將它展開, 會看到圖 4-3 的結果 其中的 build.gradle (Project: MyApplication) 是整個專案使用的 Gradle 設定檔,build.gradle (Module: app) 則是 app 模組使用的 Gradle 設定檔 開啟 build.gradle (Module: app) 設定檔, 會看到如下的結果 我們在某些項目後面加上註解 ( 這是 Gradle 設定檔正式的註解方式 ) 請讀者特別注意粗體標示的部分, 如果設定錯誤, 在建置 App 專案時會發生錯誤 compilesdkversion 是指定要用哪一個版本的 Android SDK 來編譯 這和前一個單元介紹的 Android SDK Manager 有關, 請讀者參考圖 4-4 compilesdkversion 必須設定為已經安裝的 SDK Platform 版本, 圖 4-4 中圈起來的 SDK Platform 的 API 編號是 23, 該項後面標示為 Installed, 所以 compilesdkversion 才可以設定成 23 至於 buildtoolsversion 必須設定為已經安裝的 Android SDK Build-tools 的版本, 圖 4-4 中圈起來的 Build-tools 版本是 24, 所以我們可以設定成 ( 有小數點是因為這一項可能會有次版本編號 ) 如果日後更新它們的版本, 這二項設定必須跟著調整 28

5 apply plugin: 'com.android.application' android { compilesdkversion 23 buildtoolsversion "24.0.0" // 指定要用哪一個版本的 Android SDK 來編譯 // 指定要用哪一個版本的 Android SDK Build-tools defaultconfig { applicationid "com.myapplication" // 指定這個 App 使用的套件路徑 minsdkversion 15 // 限制 App 要在哪一個版本以上的 Android 執行 targetsdkversion 23 // 指定 App 要使用哪一個 Android 版本的功能 versioncode 1 // 設定專案版本的編號 versionname "1.0" // 設定專案版本的名稱 buildtypes { ( 省略 ) dependencies { ( 省略 ) 圖 4-4 Android SDK Manager 檢視安裝的 Android SDK 工具版本編號 29

6 Lesson 027 使用 Fragment 讓程式介面一分為多 在設計手機或是平板電腦的 App 時, 經常面臨的一個問題, 就是不同裝置的螢幕尺寸大小不一致 當 App 在手機上執行時, 由於螢幕畫面比較小, 如果需要顯示比較多的介面元件, 就必須將程式畫面適當地切割, 再逐一顯示 但是如果 App 是在螢幕比較大的平板電腦上執行, 就可以一次顯示全部的介面元件 為了適應不同的情況, 我們需要一個具有高度彈性的介面設計機制, 讓程式能夠依照執行環境, 自動調整操作介面的顯示方式 針對以上的問題, 從 Android 3.0 版開始, 新增一個名為 Fragment 的類別 利用這個新類別, 我們可以將程式的畫面分割成數個區域 這些不同區域的程式畫面可以各自隱藏或顯示, 以適應不同螢幕尺寸的裝置 這種 Fragment 型態的程式介面具有以下特性 : 1. 程式的執行畫面可以由多個 Fragment 組成 ; 2. 每一個 Fragment 都有各自獨立的執行狀態, 並且接收各自的處理事件 ; 3. 在程式執行的過程中,Fragment 可以動態加入和移除 Fragment 其實是一個類別, 它的架構和 Activity 很類似, 二者都有自己的專屬介面佈局檔和程式檔, 而且 Fragment 在執行的過程中也會經歷不同的狀態變化 手機模擬器本身提供一個 Fragment 範例, 我們可以點選首頁的 App 程式集, 再選擇 API Demos, 然後依序選擇 App > Fragment > Layout, 就會看到圖 27-1 的畫面 乍看之下好像沒什麼特別, 可是如果按下手機模擬器右邊操作列的旋轉按鈕, 就會變成圖 27-2 的畫面 這個畫面的左邊和右邊是二個不同的 Fragment 也就是說, 這個範例程式會依照手機的方向, 改變 Fragment 的顯示模式, 這就是使用 Fragment 的好處 215

7 027 使程式介面一分為多用Fragment 讓圖 27-1 手機模擬器提供的 Fragment 範例程式 圖 27-2 旋轉手機模擬器後變成左右二個 Fragment 的畫面 27-1 使用 Fragment 的步驟 要在程式中使用 Fragment 需要完成以下步驟 : 在專案檢視視窗中, 展開 app/java 資料夾, 用滑鼠右鍵點選套件路徑名稱資料夾, 然後選擇 New > Fragment > Fragment (Blank), 就會顯示圖 27-3 的對話盒 在 Fragment Name 欄位輸入 Fragment 類別名稱,Fragment Layout Name 欄位就會自動完成命名 這個欄位就是 Fragment 介面佈局檔的名稱 它的下方有二個可以勾選的項 216

8 目, 如果勾選它們, 會在 Fragment 的程式檔中加入額外的 callback 方法 現階段我們不會用到這些方法, 因此可以取消勾選, 最後按下 Finish 按鈕 Fragment 有二個版本?! Fragment 是 Android 3.0 以後的版本才出現的功能, 因此如果以 Android 系統的支援能力來說,Android 3.0 以前的裝置並無法執行 Fragment 程式 為了解決這個問題,Google 特別開發一個名為 android-support-v4.jar 的程式庫, 只要把它放到 Android App 專案中, 就可以放心地讓程式使用 Fragment, 不必擔心舊版的 Android 系統無法支援 但是這個程式庫中的 Fragment, 和 Android 系統內建的 Fragment 不可以同時使用 我們在開發 App 專案時, 必須從二者之中選擇一個 筆者的建議是使用 android-supportv4.jar 程式庫的版本, 一來是因為可以讓 App 相容 Android 3.0 以前的裝置, 再者是因為程式庫的更新比較快, 如果有新的功能, 程式庫會比較早更新 要確定程式使用哪一個版本的 Fragment, 只要在程式檔中, 展開 import 區塊, 如果是 import android.support.v4.app.fragment;, 就是使用 androidsupport-v4.jar 程式庫的版本 如果是 import android.app.fragment;, 就是使用 Android 系統內建的版本 圖 27-3 新增 Fragment 的對話盒 217

9 027 使程式介面一分為多新增的 Fragment 介面佈局檔和程式檔會自動開啟, 編輯 Fragment 介面佈局檔的方式和我們前面學過的完全相同, 所以讀者可以運用所有學過的技巧, 來編輯這個介面佈局檔 在 Fragment 的程式檔加入需要用到的狀態處理方法, 例如 : 用Fragment 讓1. oncreate() 這是當 Fragment 被建立時會執行的方法, 我們可以在這個方法中進行必要的初始設定 2. oncreateview() 這是當 Fragment 將要顯示在螢幕上時會執行的方法, 我們必須在這個方法中設定好 Fragment 使用的介面佈局檔 3. onactivitycreated() 這是當 Fragment 底層的 Activity 被建立時會執行的方法, 我們必須在這個方法中取得 Fragment 的介面元件, 並設定給對應的介面物件, 就像是之前在 Activity 的 oncreate() 中做的事情一樣 4. onpause() 這是當 Fragment 要從螢幕上消失時會執行的方法, 我們可以在這個方法中儲存使用者的操作狀態和輸入的資料, 以便下次 Fragment 重新顯示時, 讓使用者繼續進行目前的工作 Fragment 和 Activity 一樣, 二者都有各式各樣的狀態處理方法, 讀者可以查詢 Android 官方網站的技術文件以取得更多相關資料 如果要在 Fragment 程式檔中加入狀態處理方法, 必須先將編輯游標設定到要插入的位置, 然後按下滑鼠右鍵, 從快顯功能表中選擇 Generate > Override Methods, 在顯示的對話盒中點選想要加入的狀態處理方法, 如果要複選, 可以按下鍵盤的 Ctrl 鍵 選好之後, 按下 OK 按鈕 有關 Fragment 程式檔的範例, 請讀者參考本單元後續建立的程式專案 在程式中使用建立好的 Fragment 類別 我們可以利用 <fragment> 標籤, 在主程式的介面佈局檔中使用指定的 Fragment 開啟 app/res/layout 資料夾中的主程式介面佈局檔, 在 Design 編輯模式下, 從左邊的 Palette 工具箱最下方的 Custom 群組中, 點選 <fragment>, 就會顯示對話盒讓我們選擇要使用的 Fragment 類 218

10 別, 點選想要加入的 Fragment 類別, 按下 OK 按鈕, 就會出現一個 Fragment 元件 我們可以移動滑鼠游標, 將它放到想要的位置 如 果切換到 Text 編輯模式, 就會看到如下的 Fragment 標籤 : <fragment android:name="com.gameusingfragment.myfragment" android:id="@+id/fragment" android:layout_width="match_parent" /> 使用 <fragment> 標籤時要注意以下幾點 : 1. <fragment> 標籤的開頭字母必須小寫 2. 每一個 <fragment> 標籤都要設定 android:id 屬性 3. <fragment> 標籤的 android:name 屬性是指定所使用的 Fragment 類別, 而且必須加上完整的套件路徑名稱 4. 在 <fragment> 標籤中可以使用 android:layout_weight 屬性, 用設定比例的方式控制每一個 Fragment 所佔的螢幕寬度, 此時 android:layout_width 屬性必須設定為 "0dp" 以上就是在程式專案中使用 Fragment 的步驟 27-2 範例程式 本單元的範例程式, 是將之前的 電腦猜拳遊戲 程式, 加上局數統計的功能, 並且改成用 Fragment 顯示 程式中將建立二個 Fragment, 一個用來當成遊戲的主畫面, 一個則用來顯示局數統計資料, 程式的執行畫面如圖 27-4, 以下是完成此程式專案的步驟 圖 27-4 使用 Fragment 介面的 電腦猜拳遊戲 程式 219

11 027 使程式介面一分為多用Fragment 讓執行 Android Studio 新增一個 App 專案, 專案的設定依照慣例 即可 執行前一小節的操作步驟, 建立 Fragment 的介面佈局檔和程式檔 這個 Fragment 是用來當成程式的主畫面, 我們可以將它取名為 MainFragment 接著從單元 21 的 電腦猜拳遊戲 程式專案中, 將 主程式的介面佈局檔 app/res/layout/activity_main.xml 的全部內容, 複製到這個 Fragment 的介面佈局檔中 由於遊戲畫面會用到許多字 串資源, 因此也要把原來 電腦猜拳遊戲 程式專案中的字串資源檔內容, 複製到這個新專案的字串資源檔 還有剪刀 石頭 布的影像檔也要複製過來 ( 可以在專案檢視視窗中, 用滑鼠右鍵點選檔案, 再選擇 Copy 進行檔案複製 如果要選擇多個檔案, 可以按住鍵盤的 Ctrl 鍵, 再用滑鼠點選 ) 重複前一個步驟的操作, 再建立一個顯示遊戲局數的 Fragment 類別, 我們將它取名為 GameResultFragment 以下是這個它的介面佈局檔的完整內容, 讀者可以利用 Design 模式或 Text 模式進行編輯 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:text="@string/total_set" /> <EditText android:id="@+id/edtcountset" android:layout_width="match_parent" android:focusable="false" /> <TextView android:layout_width="match_parent" android:text="@string/player_win_set" /> a <EditText android:id="@+id/edtcountplayerwin" android:layout_width="match_parent" 220

12 android:focusable="false" /> <TextView android:layout_width="match_parent" /> <EditText android:layout_width="match_parent" android:focusable="false" /> <TextView android:layout_width="match_parent" /> <EditText android:layout_width="match_parent" android:focusable="false" /> </LinearLayout> 以上的介面佈局檔會用到定義在字串資源檔 res/values/strings.xml 中 的字串如下 : <?xml version="1.0" encoding="utf-8"?> <resources> ( 其它字串 ) <string name="total_set"> 全部局數 :</string> <string name="player_win_set"> 玩家贏 :</string> <string name="comupter_win_set"> 電腦贏 :</string> <string name="draw"> 平手 :</string> </resources> 利用前一小節介紹的操作方式, 在 MainFragment 的程式檔加入 oncreateview() 和 onactivitycreated() 二個狀態處理方法 MainFragment 是負責顯示遊戲的主畫面, 所以它的功能和單元 20 的遊戲主程式相同, 因此讀者可以從該專案中複製程式碼再進行修改 要提醒讀者的是在 Fragment 中必須先呼叫 getview() 取得程式畫面物件, 然後才能呼叫它的 findviewbyid() 取得介面物件 如果要取得 221

13 027 使程式介面一分為多用Fragment 讓Fragment 底層的 Activity, 可以呼叫 getactivity() 方法 在 oncreateview() 方法中, 我們利用 inflater 物件的 inflate() 方法取得 res/layout/fragment_main.xml 介面佈局檔, 並將最後的結果傳回給 系統, 這樣就完成了 Fragment 的介面設定 以下是 MainFragment 類別的程式檔 : package import public class MainFragment extends Fragment { private ImageButton mimgbtnscissors, mimgbtnstone, mimgbtnpaper; private ImageView mimgviewcomplay; private TextView mtxtresult; private TextView medtcountset, medtcountplayerwin, medtcountcomwin, medtcountdraw; // 新增統計遊戲局數和輸贏的變數 private int micountset = 0, micountplayerwin = 0, micountcomwin = 0, micountdraw = public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { // 利用 inflater 物件的 inflate() 方法取得介面佈局檔, 並將最後的結果傳回給系統 return inflater.inflate(r.layout.fragment_main, container, public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); // 必須先呼叫 getview() 取得程式畫面物件, 然後才能呼叫它的 // findviewbyid() 取得介面物件 mtxtresult = (TextView) getview().findviewbyid(r.id.txtresult); mimgbtnscissors = (ImageButton) getview().findviewbyid(r.id.imgbtnscissors); mimgbtnstone = (ImageButton) getview().findviewbyid(r.id.imgbtnstone); mimgbtnpaper = (ImageButton) getview().findviewbyid(r.id.imgbtnpaper); 222

14 mimgviewcomplay = (ImageView) getview().findviewbyid(r.id.imgviewcomplay); // 以下介面元件是在另一個 Fragment 中, 因此必須呼叫所屬的 Activity // 才能取得這些介面元件 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); mimgbtnscissors.setonclicklistener(imgbtnscissorsonclick); mimgbtnstone.setonclicklistener(imgbtnstoneonclick); mimgbtnpaper.setonclicklistener(imgbtnpaperonclick); private View.OnClickListener imgbtnscissorsonclick = new View.OnClickListener() { public void onclick(view v) { // Decide computer play. int icomplay = (int)(math.random()*3 + 1); micountset++; medtcountset.settext(string.valueof(micountset)); // 1 - scissors, 2 - stone, 3 - net. if (icomplay == 1) { mimgviewcomplay.setimageresource(r.drawable.scissors); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_draw)); micountdraw++; medtcountdraw.settext(string.valueof(micountdraw)); else if (icomplay == 2) { mimgviewcomplay.setimageresource(r.drawable.stone); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_lose)); micountcomwin++; medtcountcomwin.settext(string.valueof(micountcomwin)); else { mimgviewcomplay.setimageresource(r.drawable.paper); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_win)); micountplayerwin++; medtcountplayerwin.settext (String.valueOf(miCountPlayerWin)); 223

15 027 使程式介面一分為多用Fragment 讓 ; private View.OnClickListener imgbtnstoneonclick = new View.OnClickListener() { public void onclick(view v) { int icomplay = (int)(math.random()*3 + 1); ; micountset++; medtcountset.settext(string.valueof(micountset)); // 1 - scissors, 2 - stone, 3 - net. if (icomplay == 1) { mimgviewcomplay.setimageresource(r.drawable.scissors); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_win)); micountplayerwin++; medtcountplayerwin.settext (String.valueOf(miCountPlayerWin)); else if (icomplay == 2) { mimgviewcomplay.setimageresource(r.drawable.stone); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_draw)); micountdraw++; medtcountdraw.settext(string.valueof(micountdraw)); else { mimgviewcomplay.setimageresource(r.drawable.paper); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_lose)); micountcomwin++; medtcountcomwin.settext(string.valueof(micountcomwin)); private View.OnClickListener imgbtnpaperonclick = new View.OnClickListener() { public void onclick(view v) { int icomplay = (int)(math.random()*3 + 1); micountset++; medtcountset.settext(string.valueof(micountset)); // 1 - scissors, 2 - stone, 3 - net. if (icomplay == 1) { mimgviewcomplay.setimageresource(r.drawable.scissors); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_lose)); 224

16 ; micountcomwin++; medtcountcomwin.settext(string.valueof(micountcomwin)); else if (icomplay == 2) { mimgviewcomplay.setimageresource(r.drawable.stone); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_win)); micountplayerwin++; medtcountplayerwin.settext (String.valueOf(miCountPlayerWin)); else { mimgviewcomplay.setimageresource(r.drawable.paper); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_draw)); micountdraw++; medtcountdraw.settext(string.valueof(micountdraw)); 學習 Android App 開發的過程中, 會遇到愈來愈多的 class 每一個 class 都有許多內定的方法, 我們必須視程式的需要 override 某些方法, 像是這裡用到的 onactivitycreated() 和 oncreateview() 當要 override 類別內部的方法時, 先將文字輸入游標設定到要插入方法的位置, 再按下滑鼠右鍵, 選擇快顯功能表中的 Generate > Override Methods, 就會顯示方法清單對話盒讓我們選擇 如果程式中有不同類別的程式碼, 把編輯游標設定到不同類別內部, 可以叫出不同的方法清單對話盒 切換到 GameResultFragment 的程式檔, 把內容編輯如下 : package import public class GameResultFragment extends Fragment public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { // 利用 inflater 物件的 inflate() 方法取得介面佈局檔, 225

17 027 使程式介面一分為多 // 並將最後的結果傳回給系統 return inflater.inflate(r.layout.fragment_game_result, container, false); 用Fragment 讓開啟主程式的介面佈局檔 app/res/layout/activity_main.xml, 將內容 編輯如下 <LinearLayout xmlns:android=" ( 自動產生的屬性設定 ) android:orientation="horizontal" android:gravity="center"> <fragment android:id="@+id/fragmain" android:name="com.gameusingfragment.mainfragment" android:layout_width="wrap_content" /> <fragment android:id="@+id/fraggameresult" android:name="com.gameusingfragment.gameresultfragment" android:layout_width="match_parent" /> </LinearLayout> 這個單元是我們第一次學習 Fragment 的用法, 為了不要讓問題太過複 雜, 我們先以靜態的方式使用 Fragment 下一個單元我們將進一步學習, 如何在程式執行的過程中, 動態加入和移除 Fragment 226

18 Lesson 028 動態 Fragment 讓程式成為變形金剛 前一個單元我們介紹了 Fragment 的基本功能和用法, 實作範例是以靜態的方式使用 Fragment 也就是說, 不會在程式執行的過程中讓 Fragment 隱藏或顯示 但是其實 Fragment 最大的優點是動態控制, 也就是在程式執行過程中, 可以隨時加入或是移除 Fragment, 或是用一個新的 Fragment 取代原來的 Fragment 利用這種方式, 我們可以讓程式的操作介面, 依照使用者的喜好, 或是執行環境的限制, 做出各種變化 想要在程式執行的過程中動態控制 Fragment, 需要用到 FragmentManager, 因此接下來就讓我們來介紹本單元的主角 - FragmentManager 28-1 Fragment 的總管 - FragmentManager 要在程式中改變 Fragment, 必須藉助 FragmentManager 物件, FragmentManager 物件提供以下控制 Fragment 的方法 : 1. add() 把 Fragment 加入程式的操作介面, 我們可以指定要加入哪一個介面元件中, 例如指定一個 FrameLayout 元件, 另外也可以設定這個 Fragment 的 tag 名稱 2. remove() 從程式的操作介面中移除指定的 Fragment, 並將它刪除 3. replace() 用另一個 Fragment 取代目前程式畫面中的 Fragment, 它的功能等同於先呼叫 remove() 移除目前的 Fragment, 再呼叫 add() 加入另一個 Fragment 227

19 028 動程式成為變形金剛4. attach() 將之前 detach 的 Fragment 重新顯示在程式畫面,Fragment 的畫面會重新建立 5. detach() 態Fragment 讓將指定的 Fragment 從程式畫面移開, 這時候 Fragment 的畫面會被刪除, 等到下次 attach 的時候再重新建立 6. hide() 隱藏指定的 Fragment 7. show() 顯示之前隱藏的 Fragment 8. addtobackstack() 把這個 Fragment 的交易加入系統的 Back Stack, 這樣當使用者按下手機或平板電腦上的 回上一頁 按鍵時, 就會回復到之前的狀態 9. setcustomanimations() 設定變換 Fragment 時使用的動畫效果 但是要特別注意, 如果使用 Android 3.0 以上的系統內建的 FragmentManager, 必須使用 Property Animation 但是如果是用 android.support.v4.app 套件的 FragmentManager, 就必須使用 View Animation 10. commit() 要求系統開始執行 Fragment 的切換, 但是要注意, 系統是用一個非同步的 process 來進行, 所以 Fragment 的切換不會立即完成 如果程式需要立刻完成 Fragment 的切換, 可以隨後呼叫 FragmentManager 物件的 executependingtransactions() 方法 在程式中, 改變 Fragment 的過程稱為一個 Transaction( 中文的意思是 交易 ) Transaction 的特性是整個操作必須從頭到尾全部完成才算數, 不能只執行其中一部份 如果不能從頭到尾全部完成, 就要回到原來未執行 Transaction 之前的狀態 在使用 FragmentManager 控制 Fragment 的過程中, 必須依序執行以下幾個步驟 : 呼叫 getfragmentmanager() 方法取得 FragmentManager FragmentManager fragmentmgr = getfragmentmanager(); 228

20 呼叫 FragmentManager 的 begintransaction() 方法建立一個 FragmentTransaction 物件 FragmentTransaction fragmenttrans = fragmentmgr.begintransaction(); 利用 FragmentTransaction 物件提供的方法, 控制 Fragment 請讀 者參考以下程式碼範例, 其中的 MyFragmentA 和 MyFragmentB 是 在程式專案中, 已經建立好的二個 Fragment 類別 framelay 是在主 程式介面佈局檔中的 FrameLayout 元件, 通常我們都是用 FrameLayout 當成 Fragment 的容器 也就是說, 把 Fragment 物件 放到 FrameLayout 元件裡頭 MyFragmentA myfragmenta = new MyFragmentA(); MyFragmentB myfragmentb = new MyFragmentB(); fragmenttrans.add(r.id.framelay, myfragmenta, "My fragment A"); fragmenttrans.add(r.id.framelay, myfragmentb, "My fragment B"); 在呼叫 add() 方法之前, 我們必須先建立 Fragment 物件 呼叫 add() 方法時, 必須指定要將 Fragment 加入哪一個介面元件中 ( 這個介面元件就稱為 Fragment 的容器 ) 另外我們也可以幫這個新加入的 Fragment 取一個名稱 ( 稱為 Tag, 就是 add() 方法的第三個參數 ), 這個 Tag 可以讓我們找到特定的 Fragment 使用 new 運算子或是 newinstance() 靜態方法建立 Fragment 物件 Android Developers 官方網站的技術文件, 建議使用 Fragment 類別的 newinstance() 靜態方法來建立 Fragment 物件, 避免使用 new 運算子, 這是考量 Fragment 類別的建構式含有引數的情形 要解釋其中的原因, 必須先瞭解 Android 系統在運作的過程中, 有時候會強制銷毀 Fragment 物件, 再重新建立它, 例如當手機或是平板電腦從直立轉成水平時,App 會被強制結束, 再重新啟動 當 Android 系統要重新建立 Fragment 物件的時候, 會執行空的建構式 ( 也就是不含任何引數的建構式 ), 再將銷毀 Fragment 物件時儲存的 Bundle 物件, 傳給 Fragment 的 oncreate() 方法 這樣 Fragment 物件就可以回復到原來銷毀時的狀態 ( 我們的程式要自己從 Bundle 物件中取出資料來使用 ), 也就是說每一個 Fragment 類別都要提供一個空的建構式讓系統呼叫 如果要在建立 Fragment 物件時傳入引數, 正確的做法是定義一個 newinstance() 靜態方法, 用來接收傳入的引數, 在這個 newinstance() 方法中, 利用 new 運算子建立一個 Fragment 物件, 並且把傳入的引數儲存在一 229

21 028 動程式成為變形金剛個 Bundle 物件裡頭, 再把這個 Bundle 物件設定給 Fragment 物件 然後在 Fragment 的 oncreate() 狀態處理方法中, 取得 Bundle 物件, 再取出其中的資料 如果建立 Fragment 物件時不需要傳入任何引數, 就可以直接利用 new 運算子來建立, 如同本單元的範例程式 態Fragment 讓呼叫 FragmentTransaction 的 commit() 方法, 啟動 Fragment 處理流程 但是要注意,Android 系統並不是立刻執行, 而是以執行緒 ( background thread ) 的方式來處理 如果我們希望立刻執行 Fragment 的處理流程, 必須再執行下一個步驟 fragmenttrans.commit(); 如果程式需要立刻執行 Fragment 的處理, 可以呼叫 FragmentManager 的 executependingtransactions() 方法 fragmentmgr.executependingtransactions(); 我們可以利用之前介紹過的 匿名物件 語法, 將上述操作 Fragment 的程式碼簡化如下 : getfragmentmanager().begintransaction().add(r.id.framelay, myfragmenta, "My fragment A").add(R.id.frameLay, myfragmentb, "My fragment B").commit(); 28-2 範例程式 上一個單元的 電腦猜拳遊戲, 是用二個 Fragment 組成操作介面 其中一個 Fragment 用來顯示操作元件, 另一個則顯示局數統計資料 這二個 Fragment 都是固定出現在程式畫面中 這個單元我們將把局數統計資料的 Fragment 改成可以動態顯示和隱藏, 並且新增第二種局數統計資料的顯示方式, 讓使用者可以依喜好自由選擇 圖 28-1 是程式的執行畫面, 一開始並不會顯示局數統計資料, 必須按下 顯示結果 1 或 顯示結果 2 按鈕才會出現局數統計畫面 以下是完成這個程式專案的詳細步驟 : 230

22 圖 28-1 使用動態 Fragment 的 電腦猜拳遊戲 程式 利用 Windows 檔案總管複製前一個單元的程式專案, 再將複製的資 料夾改成想要的名稱 然後利用 Android Studio 的 Import Project 功 能, 載入複製的 App 專案 依照前一個單元的操作方法, 新增一個 Fragment, 我們可以將它取 名為 GameResult2Fragment, 它是用來當作第二種局數統計資料的 畫面 我們在這個新的介面佈局檔中, 換成用 TableLayout 顯示局數 統計資料 請將介面佈局檔編輯如下, 可以先用 Design 模式加入介 面元件, 再切換到 Text 模式設定屬性 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=" ( 自動產生的屬性設定 ) android:layout_gravity="center_horizontal" > <TableRow> <TextView android:text="@string/total_set" android:textsize="20sp" android:textcolor="#0fffff" /> <EditText android:id="@+id/edtcountset" android:focusable="false" android:layout_weight="1" /> </TableRow> 231

23 028 動程式成為變形金剛態Fragment 讓<TableRow> <TextView android:textsize="20sp" android:textcolor="#0fffff" /> <EditText android:focusable="false" android:layout_weight="1" /> </TableRow> <TableRow> <TextView android:textsize="20sp" android:textcolor="#0fffff" /> <EditText android:focusable="false" android:layout_weight="1" /> </TableRow> <TableRow> <TextView android:textsize="20sp" android:textcolor="#0fffff" /> <EditText android:focusable="false" android:layout_weight="1" /> </TableRow> </TableLayout> 我們要先將 MainFragment 中, 用來顯示局數統計的 TextView 物件改成 public, 這樣一來 GameResultFragment 和 GameResult2Fragment 的 程式碼就可以直接使用 public class MainFragment extends Fragment { private ImageButton mimgbtnscissors, mimgbtnstone, mimgbtnpaper; private ImageView mimgviewcomplay; private TextView mtxtresult; public EditText medtcountset, medtcountplayerwin, medtcountcomwin, medtcountdraw; ( 其它程式碼 ) 232

24 將 GameResult2Fragment 的程式檔編輯如下 : package import public class GameResult2Fragment extends Fragment { public GameResult2Fragment() { // Required empty public public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { // 利用 inflater 物件的 inflate() 方法取得介面佈局檔, // 並將最後的結果傳回給系統 return inflater.inflate(r.layout.fragment_game_result2, container, public void onresume() { super.onresume(); MainFragment frag = (MainFragment) getfragmentmanager().findfragmentbyid(r.id.fragmain); frag.medtcountset = (EditText) getactivity(). findviewbyid(r.id.edtcountset); frag.medtcountplayerwin = (EditText) getactivity().findviewbyid(r.id.edtcountplayerwin); frag.medtcountcomwin = (EditText) getactivity().findviewbyid(r.id.edtcountcomwin); frag.medtcountdraw = (EditText)getActivity(). findviewbyid(r.id.edtcountdraw); 以上的程式碼除了 oncreateview() 方法之外, 還多了一個 onresume() 方法 ( 操作提示 : 在程式碼中插入新方法的操作步驟可以參考上一個單元的說明 ) 這個方法裡頭的程式碼是設定用來顯示局數統計資料的介面物件, 這些介面物件是宣告在 MainFragment 類別中, 而且必須等使用者開啟局數統計的 Fragment 之後才能使用, 233

25 028 動程式成為變形金剛態Fragment 讓因此我們必須在 onresume() 中執行 ( 未開啟局數統計 Fragment 之 前這些介面物件並不存在, 因此也無法使用 ) 當使用者建立一個 GameResult2Fragment 物件, 並將它加入程式畫面 時,onCreateView() 方法會先執行 當 GameResult2Fragment 物件即 將顯示在螢幕上時, 會執行 onresume() 方法, 因此我們在 onresume() 方法中設定好介面物件 這裡我們使用 FragmentManager 的 findfragmentbyid() 方法取得程式中的 MainFragment 物件, 再將其中 宣告的介面物件設定成對應的介面元件 在 Android Studio 左邊的專案檢視視窗中, 展開 app/java/( 套件路 徑名稱 )/GameResultFragment 程式檔, 將它開啟, 再依照同樣的 方法加入 onresume(), 然後加入下列粗體標示的程式碼 這一段程 式碼和上一個步驟的程式碼完全相同, 也就是說 GameResultFragment 和 GameResult2Fragment, 除了元件排列方 式不同之外, 內部的功能完全相同 package import public class GameResultFragment extends Fragment public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { // 利用 inflater 物件的 inflate() 方法取得介面佈局檔, // 並將最後的結果傳回給系統 return inflater.inflate(r.layout.fragment_game_result, container, public void onresume() { super.onresume(); MainFragment frag = (MainFragment) getfragmentmanager().findfragmentbyid(r.id.fragmain); frag.medtcountset = (EditText) getactivity().findviewbyid(r.id.edtcountset); frag.medtcountplayerwin = (EditText) getactivity().findviewbyid(r.id.edtcountplayerwin); frag.medtcountcomwin = (EditText) getactivity() 234

26 .findviewbyid(r.id.edtcountcomwin); frag.medtcountdraw = (EditText)getActivity(). findviewbyid(r.id.edtcountdraw); 開啟主程式介面佈局檔 app/res/layout/activity_main.xml, 刪除第二 個 <fragment> 標籤, 然後在同樣的位置加入一個 <FrameLayout> 標 籤, 並且設定屬性如下 這個 FrameLayout 元件將作為 Fragment 物 件的容器, 我們會在程式碼中, 依照使用者的操作, 把不同的 Fragment 放進這個 FrameLayout 元件 <LinearLayout xmlns:android=" xmlns:tools=" android:id="@+id/linearlayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".mainactivity" android:gravity="center_horizontal" > <fragment android:id="@+id/fragmain" android:name="com.android.mainfragment" android:layout_width="wrap_content" /> <FrameLayout android:id="@+id/framelay" android:layout_width="wrap_content" android:layout_margin="50dp" android:padding="20dp" /> </LinearLayout> 開啟介面佈局檔 app/res/layout/fragment_main.xml, 我們在最後加入三個按鈕, 使用者可以利用這些按鈕啟動二種局數統計資料畫面, 或是隱藏局數統計資料畫面 這裡我們用到許多控制介面元件位置和外觀的屬性, 以增加程式畫面的美觀 235

27 028 動程式成為變形金剛<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_width="400dp" android:layout_height="match_parent" android:layout_gravity="center_horizontal" > 態Fragment 讓 ( 原來的程式碼 ) <Button android:id="@+id/btnshowresult1" android:layout_width="wrap_content" android:text="@string/btn_show_result1" android:layout_below="@id/txtresult" android:layout_alignleft="@id/txtcom" android:textsize="20sp" android:layout_margintop="10dp" /> <Button android:id="@+id/btnshowresult2" android:layout_width="wrap_content" android:text="@string/btn_show_result2" android:layout_below="@id/txtresult" android:layout_alignleft="@id/imgbtnpaper" android:textsize="20sp" android:layout_margintop="10dp" /> <Button android:id="@+id/btnhiddenresult" android:layout_width="wrap_content" android:text="@string/btn_hidden_result" android:layout_below="@id/btnshowresult1" android:layout_centerinparent="true" android:textsize="20sp" android:layout_margintop="10dp" /> </RelativeLayout> 這三個新按鈕用到定義在字串資源檔中的字串 : <?xml version="1.0" encoding="utf-8"?> <resources> ( 原來的字串 ) <string name="btn_show_result1"> 顯示結果 1</string> <string name="btn_show_result2"> 顯示結果 2</string> <string name="btn_hidden_result"> 隱藏結果 </string> </resources> 236

28 開啟負責顯示遊戲畫面的 Fragment 程式檔 src/( 套件路徑名稱 )/ MainFragment.java, 我們在裡頭加入前一個步驟新增的三個按鈕所 對應的物件, 並設定好它們的 OnClickListener, 如以下粗體字的部 分 此外為了記錄程式是否開啟局數統計的顯示畫面, 我們新增一個 mbshowresult 變數, 並在三個按鈕的 OnClickListener 中對它進行 設定 在這些按鈕的 OnClickListener 中, 我們依照上一個小節介紹 的 Fragment 操作技巧, 分別顯示或隱藏局數統計畫面 最後在 剪 刀 石頭 和 布 的按鈕的 OnClickListener 中, 將顯示局數 統計資料的程式碼集中放到最後, 只有當 mbshowresult 變數的值是 true 的時候才顯示 package import public class MainFragment extends Fragment { private ImageButton mimgbtnscissors, mimgbtnstone, mimgbtnpaper; private ImageView mimgviewcomplay; private TextView mtxtresult; public EditText medtcountset, medtcountplayerwin, medtcountcomwin, medtcountdraw; // 新增統計遊戲局數和輸贏的變數 private int micountset = 0, micountplayerwin = 0, micountcomwin = 0, micountdraw = 0; private Button mbtnshowresult1, mbtnshowresult2, mbtnhiddenresult; private boolean mbshowresult = false; private final static String TAG_FRAGMENT_RESULT_1 = "Result 1", TAG_FRAGMENT_RESULT_2 = "Result public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { 237

29 028 動程式成為變形金剛 // TODO Auto-generated method stub // 利用 inflater 物件的 inflate() 方法取得介面佈局檔, // 並將最後的結果傳回給系統 return inflater.inflate(r.layout.fragment_main, container, false); 態Fragment public void onactivitycreated(bundle savedinstancestate) { // TODO Auto-generated method stub super.onactivitycreated(savedinstancestate); // 必須先呼叫 getview() 取得程式畫面物件, 然後才能呼叫它的 // findviewbyid() 取得介面物件 mtxtresult = (TextView) getview().findviewbyid(r.id.txtresult); mimgbtnscissors = (ImageButton) getview().findviewbyid (R.id.imgBtnScissors); mimgbtnstone = (ImageButton) getview().findviewbyid (R.id.imgBtnStone); mimgbtnpaper = (ImageButton) getview().findviewbyid (R.id.imgBtnPaper); mimgviewcomplay = (ImageView) getview().findviewbyid (R.id.imgViewComPlay); // 以下介面元件是在另一個 Fragment 中, 因此必須呼叫所屬的 Activity // 才能取得這些介面元件 /* 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); */ mimgbtnscissors.setonclicklistener(imgbtnscissorsonclick); mimgbtnstone.setonclicklistener(imgbtnstoneonclick); mimgbtnpaper.setonclicklistener(imgbtnpaperonclick); mbtnshowresult1 = (Button) getview().findviewbyid (R.id.btnShowResult1); mbtnshowresult2 = (Button) getview().findviewbyid (R.id.btnShowResult2); mbtnhiddenresult = (Button) getview().findviewbyid (R.id.btnHiddenResult); mbtnshowresult1.setonclicklistener(btnshowresult1onclick); mbtnshowresult2.setonclicklistener(btnshowresult2onclick); mbtnhiddenresult.setonclicklistener(btnhiddenresultonclick); 238

30 private View.OnClickListener imgbtnscissorsonclick = new View.OnClickListener() { public void onclick(view v) { // Decide computer play. int icomplay = (int)(math.random()*3 + 1); micountset++; // medtcountset.settext(string.valueof(micountset)); // 1 - scissors, 2 - stone, 3 - net. if (icomplay == 1) { mimgviewcomplay.setimageresource(r.drawable.scissors); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_draw)); micountdraw++; // medtcountdraw.settext(string.valueof(micountdraw)); else if (icomplay == 2) { mimgviewcomplay.setimageresource(r.drawable.stone); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_lose)); micountcomwin++; // medtcountcomwin.settext(string.valueof(micountcomwin)); else { mimgviewcomplay.setimageresource(r.drawable.paper); mtxtresult.settext(getstring(r.string.result) + getstring(r.string.player_win)); micountplayerwin++; // medtcountplayerwin.settext(string.valueof(micountplayerwin)); ; if (mbshowresult) { medtcountset.settext(string.valueof(micountset)); medtcountdraw.settext(string.valueof(micountdraw)); medtcountcomwin.settext(string.valueof(micountcomwin)); medtcountplayerwin.settext(string.valueof(micountplayerwin)); private View.OnClickListener imgbtnstoneonclick = new View.OnClickListener() { public void onclick(view v) { ( 參考前面 btnscissorslin 物件的程式碼修改 ) ; private View.OnClickListener imgbtnpaperonclick = 239

31 028 動程式成為變形金剛new View.OnClickListener() { public void onclick(view v) { ( 參考前面 btnscissorslin 物件的程式碼修改 ) ; 態Fragment 讓private View.OnClickListener btnshowresult1onclick = new View.OnClickListener() { public void onclick(view v) { GameResultFragment fraggameresult = new GameResultFragment(); FragmentTransaction fragtran = getfragmentmanager().begintransaction(); fragtran.replace(r.id.framelay, fraggameresult, TAG_FRAGMENT_RESULT_1); fragtran.commit(); ; mbshowresult = true; private View.OnClickListener btnshowresult2onclick = new View.OnClickListener() { public void onclick(view v) { GameResult2Fragment fraggameresult2 = new GameResult2Fragment(); FragmentTransaction fragtran = getfragmentmanager().begintransaction(); fragtran.replace(r.id.framelay, fraggameresult2, TAG_FRAGMENT_RESULT_2); fragtran.commit(); ; mbshowresult = true; private View.OnClickListener btnhiddenresultonclick = new View.OnClickListener() { public void onclick(view v) { mbshowresult = false; FragmentManager fragmgr = getfragmentmanager(); GameResultFragment fraggameresult = (GameResultFragment) fragmgr.findfragmentbytag(tag_ FRAGMENT_RESULT_1); if (null!= fraggameresult) { FragmentTransaction fragtran = fragmgr.begintransaction(); fragtran.remove(fraggameresult); fragtran.commit(); 240

32 return; GameResult2Fragment fraggameresult2 = (GameResult2Fragment) fragmgr.findfragmentbytag (TAG_FRAGMENT_RESULT_2); if (null!= fraggameresult2) { FragmentTransaction fragtran = fragmgr.begintransaction(); fragtran.remove(fraggameresult2); fragtran.commit(); ; return; 完成程式專案的修改之後, 啟動執行 由於這個 App 的介面元件比較多, 如果模擬器的螢幕太小, 會看不到完整的畫面 如果發生這種情況, 可以把每一個介面佈局檔中的 padding 和 margin 相關屬性全部刪除, 或是將文字大小設定成比較小的值 看到程式的執行畫面後, 分別按下二個不同局數統計畫面的按鈕, 將會看到如圖 28-2 和 28-3 的結果 如果要取消局數統計畫面, 可以按下 隱藏結果 按鈕 這個單元示範動態控制 Fragment 的方法, 另外我們還可以針對 Fragment 的操作提供回復 (back stack) 的功能, 這些進階的 Fragment 使用技巧我們留待下一個單元再繼續介紹 圖 28-2 第一種顯示局數統計資料的畫面 圖 28-3 第二種顯示局數統計資料的畫面 241

33 Lesson 034 SeekBar 和 RatingBar 介面元件 SeekBar 介面元件的功能類似 MS Word 程式中用來瀏覽文件的捲軸, 捲軸上有一個可以拖曳的控制鈕, 捲軸的長度代表文件全部的範圍, 控制鈕則代表目前在文件中的位置, 圖 34-1 是一個 SeekBar 元件的範例 要建立 SeekBar 元件只要在程式專案的程式介面佈局檔 res/layout/activity_main.xml 中增加一個 <SeekBar /> 標籤即可, 圖 34-1 就是利用以下的介面元件程式碼所產生 : <SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:max="100" android:progress="80" /> 圖 34-1 SeekBar 元件的範例 SeekBar 元件上的控制鈕可以讓使用者拖曳, 程式會根據它的位置來調整顯示的內容 我們必須在程式中建立一個 SeekBar 元件的 OnSeekBarChangeListener 物件, 當使用者改變了 SeekBar 上的控制鈕的位置時,Android 系統就會執行該物件中的程式碼 在這個 OnSeekBarChangeListener 物件中, 我們需要建立以下 3 個方法 : public void onprogresschanged(seekbar seekbar, int progress, boolean fromuser) { // 使用者改變 SeekBar 上的控制鈕位置時執行 public void onstarttrackingtouch(seekbar seekbar) { // 使用者按下 SeekBar 上的控制鈕, 準備要開始拖曳時執行 public void onstoptrackingtouch(seekbar seekbar) { // 使用者放開 SeekBar 上的控制鈕時執行 289

34 034 SeekBar 和RatingBar 介面元件第一個方法 onprogresschanged() 是當使用者改變了 SeekBar 上的控制鈕位置時執行, 後面二個方法是當控制鈕被按下準備拖曳時, 和控制鈕被放開時執行 在一般情況下, 我們只需要處理 onprogresschanged() 這個方法即可, 它輸入的引數包括所操作的 SeekBar 物件, 和目前控制鈕的位置 (progress 引數的值 ) RatingBar 介面元件的外觀比較特別, 它像是經常用來評比商品的一排星星 在評比的時候, 可能會用到一顆完整的星星或是半顆星星, RatingBar 元件也是一樣, 如圖 34-2 建立 RatingBar 元件的方法是在介面佈局檔中加上 <RatingBar /> 標籤如以下範例 : <RatingBar android:id="@+id/ratingbar" android:layout_width="wrap_content" style="?android:attr/ratingbarstyle" android:numstars="5" android:rating="3.5" /> 圖 34-2 RatingBar 介面元件的範例 RatingBar 元件可以利用 style 屬性來設定型態,ratingBarStyle 是預設型態, 我們也可以設定為 ratingbarstylesmall 或是 ratingbarstyleindicator ratingbarstylesmall 表示要使用小的 RatingBar, 如果設定為 ratingbarstyleindicator, 表示只用來顯示評分值, 使用者不能夠對它進行變更 android:numstars 屬性可以用來設定星星的數目,android:rating 屬性則是設定目前的評分值 評分值可以有小數點 (SeekBar 元件的 progress 屬性不可以有小數點 ) 其實 RatingBar 元件的評分值也可以用 progress 屬性來表示,progress 屬性和 rating 屬性之間的關係是,progress 屬性值剛好是 rating 屬性值的兩倍, 也就是說如果 rating 是 0.5 那麼 progress 就是 1, 如果 rating 是 1 那麼 progress 就是 2, 依此類推 程式碼中可以呼叫 RatingBar 元件的 setrating() 方法改變 rating 的值, 使用者也可以用滑鼠按下 RatingBar 元件上的星星來設定 rating 的值 如果程式要取得使用者的設定值, 就要建立一個 OnRatingBarChangeListener 物件, 該物件中需要建立以下方法 方法中的第一個引數是目前操作的 RatingBar 元件, 第二個引數 290

35 是使用者設定的評分值 如果需要取得 getprogress() 方法 progress 的值, 可以呼叫 public void onratingchanged(ratingbar ratingbar, float rating, boolean fromuser) { // 當 RatingBar 上的評分值改變時執行 接下來我們用一個範例程式來示範 SeekBar 和 RatingBar 的功能, 程式的執行畫面如圖 34-3 使用者可以拖曳 SeekBar 元件上的控制鈕, 下方的說明文字會即時更新 progress 的值 使用者也可以用滑鼠點選下方的 RatinBar 元件上的星星, 下方的說明文字會顯示目前設定的 rating 值和 progress 值 這個程式的字串資源檔 介面佈局檔和程式檔如下, 程式碼的部分主要是 SeekBar 和 RatingBar 這二個介面元件的事件處理程序, 請讀者特別留意粗體字的部分 圖 34-3 SeekBar 和 RatingBar 範例程式的執行畫面 字串資源檔 <resources> <string name="app_name">seekbar 和 RatingBar</string> <string name="seek_bar_progress">seekbar 的 Progress 值 :</string> <string name="rating_bar_value">ratingbar 的 Rating 值 :</string> <string name="rating_bar_progress">ratingbar 的 Progress 值 :</string> </resources> 介面佈局檔 <LinearLayout xmlns:android=" ( 自動產生的屬性設定 ) android:orientation="vertical" > <SeekBar 291

36 034 android:layout_width="match_parent" android:max="100" android:layout_margintop="20dp" /> SeekBar 和RatingBar 介面元件<TextView android:layout_width="match_parent" android:textsize="20sp" /> <RatingBar android:layout_width="wrap_content" style="?android:attr/ratingbarstyle" android:numstars="5" android:layout_margintop="20dp" /> <TextView android:layout_width="match_parent" android:textsize="20sp" /> <TextView android:layout_width="match_parent" android:textsize="20sp" /> </LinearLayout> 程式檔 package import public class MainActivity extends AppCompatActivity { private RatingBar mratingbar; private SeekBar mseekbar; private TextView mtxtseekbarprogress, mtxtratingbarvalue, mtxtratingbarprogress; 292

37 @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mratingbar = (RatingBar) findviewbyid(r.id.ratingbar); mseekbar = (SeekBar) findviewbyid(r.id.seekbar); mtxtseekbarprogress = (TextView) findviewbyid(r.id.txtseekbarprogress); mtxtratingbarvalue = (TextView) findviewbyid(r.id.txtratingbarvalue); mtxtratingbarprogress = (TextView) findviewbyid(r.id.txtratingbarprogress); mseekbar.setonseekbarchangelistener(seekbaronchange); mratingbar.setonratingbarchangelistener(ratingbaronchange); private SeekBar.OnSeekBarChangeListener seekbaronchange = new SeekBar.OnSeekBarChangeListener() { public void onprogresschanged(seekbar seekbar, int progress, boolean fromuser) { String s = getstring(r.string.seek_bar_progress); mtxtseekbarprogress.settext(s + String.valueOf(progress)); public void onstarttrackingtouch(seekbar seekbar) { public void onstoptrackingtouch(seekbar seekbar) { ; private RatingBar.OnRatingBarChangeListener ratingbaronchange = new RatingBar.OnRatingBarChangeListener() public void onratingchanged(ratingbar ratingbar, float rating, boolean fromuser) { String s = getstring(r.string.rating_bar_value); mtxtratingbarvalue.settext(s + String.valueOf(rating)); s = getstring(r.string.rating_bar_progress); mtxtratingbarprogress.settext(s + String.valueOf(mRatingBar.getProgress())); ; 293

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

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e Android Studio Debugging 本篇教學除了最基本的中斷點教學之外, 還有條件式中斷的教學 條件式中斷是進階的除錯技巧, 在某些特定情況中, 我們有一個函數可能會被呼叫數次, 但是我們只希望在某種條件成立時才進行中斷, 進而觀察變數的狀態 而條件式中斷這項技巧正是符合這項需求 本教學分兩部分 單步除錯 (Page2~11, 共 10) 條件式中斷點 (Page12~17, 共 6)

More information

Android Fragment

Android Fragment Android Fragment 建國科技大學資管系饒瑞佶 2017/10 V1 Android 3.0 後才支援 Fragment 解決部分 App 適應螢幕大小的問題 它類似於 Activity, 可以像 Activity 可以擁有自己的版面設計, 也和 Activity 一樣有自己的生命週期 ( 具備 oncreate() oncreateview() 與 onpause() 方法 ) LifeCycle

More information

Dynamic Layout in Android

Dynamic Layout in Android Dynamic Layout in Android 建國科技大學資管系 饒瑞佶 2013/5 V1 Layout 多半都透過 res/layout/xml 格式設定來達成 Android 是 OOP, 所以可以動態產生 Layout 重點是 Layout 的階層關係 (Hierarchy) 需要處理對應事件 最後一樣用 setcontentview 加入 Layout 一 加入現有 Layout 中

More information

Android Service

Android Service Android Service- 播放音樂 建國科技大學資管系 饒瑞佶 2013/7 V1 Android Service Service 是跟 Activity 並行 一個音樂播放程式若沒使用 Service, 即使按 home 鍵畫面離開之後, 音樂還是照播 如果再執行一次程式, 新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 執行中的程式完全看不到! 但是, 寫成 Service 就不同了

More information

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

The golden pins of the PCI card can be oxidized after months or years Q. 如何在 LabWindows/CVI 編譯 DAQ Card 程式? A: 請參考至下列步驟 : 步驟 1: 安裝驅動程式 1. 安裝 UniDAQ 驅動程式 UniDAQ 驅動程式下載位置 : CD:\NAPDOS\PCI\UniDAQ\DLL\Driver\ ftp://ftp.icpdas.com/pub/cd/iocard/pci/napdos/pci/unidaq/dll/driver/

More information

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

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;

More information

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

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class 踩地雷遊戲 高慧君南港高中 開啟專案 MineSweep 任務一 : 產生 30X20 個磚塊編輯 Table 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; Write a description of class MyWorld

More information

46 2011 11 467 數位遊戲式學習系統 7 2011 11 467 47 3 DBGameSys 48 2011 11 467 正規化資料模組 如何配置並儲存電子化資料 以 便減少資料被重覆儲存的程序 DBGameSys的主要功能模組包 學習者 審核評分模組 含 正規化資料模組 審核評分 模組 高分列表模組3大區塊 系統資料庫 在正規化資料模組的執行 高分列表模組 過程中 先要求學習者瀏覽遊戲

More information

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

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4 JAVA Extension 0..\Example\Ch0\ \ T.html..\Example\Ch0\ \ T.txt T.txt..\Example\Ch0\ \ T_Ok.html 提示 :. Marquee Marquee Font Color #FFFFFF BG Color #867bf Width 90 Height 50. T.txt Ctrl+C your scrolling

More information

PowerPoint 簡報

PowerPoint 簡報 UI 設計 Android 專案目錄架構 Android 專案建立後會自動產生 3 個主要目錄 src:java 程式檔案 res: 資源 ( 文字 圖形 聲音檔案等 ) 與 UI 設定有關的 layout 檔 此目錄內檔案名稱只能為小寫字母 數字 _. gen:r.java 根據 res 目錄內容自動產生 不要去修改 R.java Android 中所有的資源檔案 ( 圖片 XML 等 ) 命名都必須使用英文小寫,

More information

建立Android新專案

建立Android新專案 經濟部工業局 Android 智慧型手機程式設計實務應用班 Android WebService 建國科技大學資管系 饒瑞佶 2012/4 WebService 需要 ksoap2-android-assembly-2.5.2-jar-withdependencies.jar 或 ksoap2-android-assembly-2.5.2-jar-withdependencies_timeout1.jar

More information

Microsoft Word - ACL 作者序

Microsoft Word - ACL 作者序 106 讓程式畫面更生動有趣的 ImageButton 和 ImageView 看完前面幾個單元, 不曉得讀者是不是覺得 Android App 專案好像有點複雜? 不僅專案中有許多不同功能的資料夾, 而且程式功能描述檔 AndroidManifest.xml 好像也不太簡單, 還有許多不同型態的資源, 像是字串 顏色 Selector 和 style 對於初學者來說, 剛開始學習 Android

More information

幻灯片 1

幻灯片 1 Delivering accurate maps to Chinese Android users 为中国安卓用户提供准确的地图服务 Work at Mapbox includes: Android apps, demos, starter kits, documentation, support, syncing Android team with other departments, etc.

More information

投影片 1

投影片 1 資料庫管理程式 ( 補充教材 -Part2) 使用 ADO.NET 連結資料庫 ( 自行撰寫程式碼 以實現新增 刪除 修改等功能 ) Private Sub InsertButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InsertButton.Click ' 宣告相關的 Connection

More information

Android Android Android SDK iv

Android Android Android SDK iv Android Market Google Android SDK Apple Google Microsoft b2c b 2010 Internet Android how why iii Android 240... Android Android SDK iv Android Market Google Android SDK Visual C++ Java N-tier J2EE Unix/Linux

More information

CU0594.pdf

CU0594.pdf 8 SOHO 1 3 003 SOHO SOHO Coder Programmer HTML CSS PHP JavaScrip 009 LECTURE 1-1 1 048 PART 2 LECTURE 1-1 1 049 SOHO Landing Page Landing 050 PART 2 LECTURE 1-1 1 SEO SEO P.093 SEO SEO SEO SEO SEO 051

More information

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8 Smart TPM Rev. 1001 Smart TPM Ultra TPM Smart TPM TPM...3 1. BIOS... 3 2. Infineon TPM Smart TPM... 4 2.1. Infineon TPM...4 2.2. Smart TPM...4 3. TPM... 5 3.1. Smart TPM TPM...5 3.2. Advanced Mode...8

More information

Microsoft Word - 02.目錄.doc

Microsoft Word - 02.目錄.doc 目錄 -1- 目錄 序 準備篇 一 使用說明... 0-2 二 標示說明... 0-6 三 注意事項... 0-7 第一類 Android 基礎知識 -UI 設計及語法應用 101. 整存整付計算機... 1-2 102. 電費計算機... 1-8 103. 點餐系統... 1-18 104. 計算 BMI 值... 1-23 105. MENU 功能選單... 1-36 106. 畫廊展示...

More information

PowerPoint Presentation

PowerPoint Presentation Part 2 開始我們的 Android 程式設 計之旅 單元 4 安裝 Android 程式開發工具 單元 5 使用 Eclipse 建立第一個 Android 應用程式單元 6 瞭解 Android 程式專案的架構和執行流程單元 7 使用 TextView EditText 和 Button 介面元件單元 8 程式的錯誤類型和除錯方法單元 9 Eclipse 進階程式專案管理技巧單元 10 讓程式有美好的未來

More information

Android + NFC

Android + NFC Android + NFC 建國科技大學資管系饒瑞佶 2017/3 v1 讀取 Tag UUID Android 2.3.3 (API Level 10) 才有支援完整的 NFC 功能 只要 NFC 相容都讀的到 (NFC 或 Mifare) 建立新專案修改 AndroidManifest.xml 加入 , 如果有 NFC Tag 進入感測範圍, 本 App 也會變成可處理的

More information

ShareText

ShareText 作者 : 林致宇 日期 :2012/1/23 問題 : 如何分享分享文字資訊給其它的應用程式? 解答 : 有時候我們可能會希望 我們的應用程式的資訊 能夠讓使用者分享出去, 讓使用者能夠將此資訊傳送簡訊給其好友或寄電子郵件的方式寄給其好友, 這份文件將示範如何寫出這樣的應用程式 本文件將產出兩個 App, 第一個 App 是 分享資料的來源, 名為 CopyPaste_Source, 功能非常簡單,

More information

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

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1 0 0 = 1 0 = 0 1 = 0 1 1 = 1 1 = 0 0 = 1 : = {0, 1} : 3 (,, ) = + (,, ) = + + (, ) = + (,,, ) = ( + )( + ) + ( + )( + ) + = + = = + + = + = ( + ) + = + ( + ) () = () ( + ) = + + = ( + )( + ) + = = + 0

More information

建立Android新專案

建立Android新專案 Android 智 慧 型 手 機 程 式 設 計 Android WebService 建 國 科 技 大 學 資 管 系 饒 瑞 佶 2012/4 V1 2012/8 V2 2013/5 V3 2014/10 v4 提 醒 這 節 的 內 容 針 對 的 是 MS 的 Web Service 或 是 使 用 SOAP(Simple Object Access Protocol) 標 準 建 立

More information

目 錄 版 次 變 更 記 錄... 2 原 始 程 式 碼 類 型 之 使 用 手 冊... 3 一 安 裝 軟 體 套 件 事 前 準 備... 3 二 編 譯 流 程 說 明... 25 1

目 錄 版 次 變 更 記 錄... 2 原 始 程 式 碼 類 型 之 使 用 手 冊... 3 一 安 裝 軟 體 套 件 事 前 準 備... 3 二 編 譯 流 程 說 明... 25 1 科 技 部 自 由 軟 體 專 案 原 始 程 式 碼 使 用 手 冊 Source Code Manual of NSC Open Source Project 可 信 賴 的 App 安 全 應 用 框 架 -App 應 用 服 務 可 移 轉 性 驗 證 Trusted App Framework -Transferability Verification on App MOST 102-2218-E-011-012

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

Chapter 3 Camera Raw Step negative clarity +25 ] P / Step 4 0 ( 下一頁 ) Camera Raw Chapter 3 089

Chapter 3 Camera Raw Step negative clarity +25 ] P / Step 4 0 ( 下一頁 ) Camera Raw Chapter 3 089 Photoshop CC Camera Raw Photoshop Camera Raw Step 1 3 1 2 3 SCOTT KELBY Step 2 B Camera Raw 088 Chapter 3 Camera Raw Chapter 3 Camera Raw Step 3-4 -100 negative clarity +25 ] P / -75-50 Step 4 0 ( 下一頁

More information

Microsoft PowerPoint - VB14.ppt

Microsoft PowerPoint - VB14.ppt VB 列表盒 LISTBOX 應用 資科系 林偉川 執行畫面 1 2 1 重要屬性 LISTBOX 物件 (VB6) 新增至 LISTBOX 物件中 ADDITEM 自 LISTBOX 物件中刪除選取物件 REMOVEITEM 自 LISTBOX 物件中取出選取物件 ListIndex 顯示 LISTBOX 物件中紀錄個數 Listcount 3 LISTBOX 物件 (VB.NET) 重要屬性 新增至

More information

書面

書面 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 5.4 互動功能畫面 程式碼請參考附件-程式三 在進入互動頁面時 會執行setAllText()依寵物狀態數值來 設定狀態文字與頭像 並且依心情決定是否要不要播放音效 觸摸的區域 由於是自己寫的 view 所以並未透過xml來設置 而是透過Layut.addview()來動態新增

More information

投影片 1

投影片 1 計算機程式及實習 期末報告 題目 : 六宿炒翻天 班級 : 奈米一乙姓名 : 陳洋翼學號 :4A514050 老師 : 謝慶存 程式說明 設計結帳系統, 選擇數量後, 在按下計算, 將會顯示總金額 若是老人或小孩, 將可享 8 折或 9 折的優惠 程式畫面 填選數量 在火腿蛋炒飯的數量選擇 1, 並按下計算, 可得總金額 50 元 程式畫面 打折 填選完後, 若客人是小孩或老人, 選擇欲打折項目,

More information

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

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 : EditText 实现城市搜索 1801210778 邹宇航 摘要 : 使用 EditText 实现搜索城市的功能, 以此为依据更新 ListView 1. 效果图 : 2. 主要步骤 (1) 在 select-city.xml 布局文件中中添加 EditText 控件用作搜索框, 然后添加 ListView 控件用来显示城市名字内容 代码如下 : 预览图 : (2) 在 SelectCity.java

More information

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

0511-Android程式之GPS應用_專題週記4 逢甲大學通訊工程學系專題研究 Android 程式之 GPS 應用 專題週記 0511 學生姓名 陳彥儒 D0035131 廖元譽 D0077791 指導老師 楊豐瑞老師繳交日期 2014.05.11 1 匯入 GoogleMap 1.1 取得授權步驟 目前進度 取得 Google 授權鑰匙 實作程式尚未成功 1.1.1 建立個人的 keystore 1.1.2 由個人的 keystore 查詢 SHA1

More information

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

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00 Excel - - Excel - -4-5 840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00 ( 0 ) 智慧標籤 相關說明提示 -5 -- Excel 4 5 6 7 8 + - * / % ^ = < >= & 9 0 (:) (,) ( ) Chapter - :,

More information

PowerPoint 簡報

PowerPoint 簡報 Paint 繪圖板 JAVA 程式設計 指導老師 : 鄞宗賢 組員 : 4A3G0901 劉彥佐 4A3G0907 韓偉志 畫面預覽 匯入參數 package paint; import java.awt.*; import java.awt.event.*; import javax.swing.*; 主程式 public class paint{ public static void main(string[]

More information

( )... 5 ( ) ( )

( )... 5 ( ) ( ) 2016 大學校院招收大陸地區學生聯合招生委員會 71005 臺南市永康區南臺街 1 號 E-mail:rusen@stust.edu.tw WEB:http://rusen.stust.edu.tw TEL:+886-6-2435163 FAX:+886-6-2435165 2 0 1 6 0 1 1 9 2016... 2... 3... 5 ( )... 5 ( )... 5 1... 6 2...

More information

運算子多載 Operator Overloading

運算子多載 Operator Overloading 多型 Polymorphism 講師 : 洪安 1 多型 編譯時期多型 ( 靜態多型 ) function overloading 如何正確呼叫同名的函數? 利用參數個數與型態 operator overloading 其實同 function overloading 執行時期多型 ( 或動態多型 ) 如何正確呼叫不同物件的相同名稱的成員函數 利用繼承與多型 2 子類別與父類別物件間的指定 (assignment)

More information

Microsoft Word - AEL CH05.doc

Microsoft Word - AEL CH05.doc 5-2 AutoCompleteTextView AutoCompleteTextView 非常類似 EditText, 屬於文字輸入方塊 ; 不過 AutoCompleteTextView 會在使用者輸入幾個字時就會顯示提示文字, 方便使用者選取而無需輸入所有文字, 是一種體貼使用者輸入的設計 AutoCompleteTextView 的提示列表與 Spinner 的選項列表建立方式相同, 需要建立字串陣列來儲存欲提示的文字

More information

雲端 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

雲端 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 CHAPTER 使用 Hadoop 打造自己的雲 8 8.3 測試 Hadoop 雲端系統 4 Nodes Hadoop Map Reduce Hadoop WordCount 4 Nodes Hadoop Map/Reduce $HADOOP_HOME /home/ hadoop/hadoop-0.20.2 wordcount echo $ mkdir wordcount $ cd wordcount

More information

FETnet - Acer Iconia Tab  (A500 Wi-Fi 版) 平板電腦操作指南

FETnet - Acer Iconia Tab  (A500 Wi-Fi 版) 平板電腦操作指南 Acer Iconia Tab (A500) 平板電腦操作指南 作業系統 :Android 3.0 / 網路頻段 :Wi-Fi 版暫不支援 :Exchange Server 信箱 ( 無法使用 Smart 助手 ) 及手寫輸入法 產品外觀安全保密功能設定數據功能 開關 PIN 碼 ( 暫無資料 ) 更改 PIN 碼 ( 暫無資料 ) 解除 PUK 碼 ( 暫無資料 ) 手機密碼鎖 手動選網 ( 暫無資料

More information

Microsoft PowerPoint - 08_Android_Spring11_Control2.pptx

Microsoft PowerPoint - 08_Android_Spring11_Control2.pptx 作者 : 李昭賢作者 : 洪振偉編撰整理者 : 陳彥霖 學習目標 1. 透過 XML 產生控制項 2. 透過 Java 產生控制項 3. 新增事件 (Event) 處理 AnalogClock / DigitalClock 負責顯示時間 AnalogClock: 以傳統鐘錶指針方式顯示時與分 DigitalClock: 以數位數字方式顯示時 分與秒 類比小時鐘 (AnalogClock 類別 ) 數位小時鐘

More information

建模与图形思考

建模与图形思考 C03_c 基 於 軟 硬 整 合 觀 點 JNI: 从 C 调 用 Java 函 数 ( c) By 高 煥 堂 3 How-to: 基 於 軟 硬 整 合 觀 點 从 C 调 用 Java 函 数 如 果 控 制 点 摆 在 本 地 C 层, 就 会 常 常 1. 从 本 地 C 函 数 去 调 用 Java 函 数 ; 2. 从 本 地 C 函 数 去 存 取 Java 层 对 象 的 属 性

More information

AutoCAD 用戶如何使用 ArchiCAD

AutoCAD 用戶如何使用 ArchiCAD AutoCAD 用戶如何使用 ArchiCAD AutoCAD用戶如何使用ArchiCAD ( 中文版 ) 由 Scott MacKenzie, Simon Gilbert, Geoffrey Moore Langdon, David Byrnes, Ralph Grabowski 編寫 龍庭資訊有限公司 1/73 - 2. 3. 4. -

More information

THE GAME GUIDE WELCOME TO DARTSLIVE DARTSLIVE.com Ver.3.0 2013.05 HOW TO PLAY BEFORE YOU START THE GAME HOW TO PLAY THE GAME HOW TO COUNT THE SCORE AWARD MOVIE 自由設定AWARD! 讓飛鏢的樂趣多更多! AWARD MOVIE是甚麼? AWARD

More information

Database_001

Database_001 作者 : 林致宇日期 :2011/10/26 主要參考來源 : http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applicat ions/ 問題 : 如在存取一個已經建立好的資料庫? 解答 : 有一些應用程式會需要讀取已經建立好的資料庫, 例如一個試題測驗應用程式, 裡面的試題可能已經於電腦上, 使用任何的

More information

Microsoft Word - ASM SDK 說明文件

Microsoft Word - ASM SDK 說明文件 System Monitor SDK (for Android) 開發者指南說明書 1. 技術項目簡介 經由簡化的應用程式介面 (Application Programming Interface), 可 提供給 Android 應用程式開發者開發基於 System monitor 的應用程式 2. 應用範圍說明 本技術可應用於具備 Android 系統 2.3.3 以上版本的 Android 嵌入式裝

More information

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android= 第 6 章广播接收者 应用案例 案例 6-1 CallRecord( 通话记录 ) 一 案例描述 1 考核知识点 030006001: 广播接收者简介 030006002: 广播接收者的创建 2 练习目标 广播的静态注册和使用 使用广播处理处理事件 3 需求分析手机最重要的功能就是通话功能, 同样储存通话记录也是必不可少的 该案例使用广 播接收者自己实现通话记录的功能 包括呼出电话 已接来电 未接来电以及通话产生的

More information

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

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5 2

单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5 2 单击以编辑母片标题样式 安卓系统 Android 的排版 授课老师 : 谢兆贤 2016/4/18 1 单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5

More information

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

Microsoft PowerPoint - 07.Android 介面元件-TableLayout、Toast、AlertDialog 計劃名稱 : 104 年度教育部資通訊軟體創新人才推升推廣計畫跨校資源中心 : 雲端運算 ( 國立中山大學 ) 課程名稱 : 網路及平台服務 Part1- 課程教材 教材名稱 :Android 介面元件 -TableLayout Toast AlertDialog 國立高雄大學資訊工程學系張保榮教授 大綱 TableLayout 版面配置 Toast 版面配置 AlertDialog 版面配置 TableLayout

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

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

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

The Embedded computing platform

The Embedded computing platform Android User Interfaces Hsiao-Lung Chan, Ph.D. Dept Electrical Engineering Chang Gung University, Taiwan chanhl@maili.cgu.edu.tw Basic control components Text components TextView EditText Button compoents

More information

Android + WebService

Android + WebService Android + Web Service 建國科技大學資管系饒瑞佶 2017/3 V1 呼叫 OpenData Web Service http://data.taipei/opendata/datalist/apiaccess?scope=resourceaquire& rid=e7c46724-3517-4ce5-844f-5a4404897b7d http://data.taipei/opendata/datalist/apiaccess?scope=resourceaquir

More information

4. 於 INF Processing Options 對話窗中, 選取 Automatic 後按 OK 5. 於 Import File 對話窗中, 按 Start Copyright by ICP DAS Co., Ltd. All rights are reserved. 2 / 12

4. 於 INF Processing Options 對話窗中, 選取 Automatic 後按 OK 5. 於 Import File 對話窗中, 按 Start Copyright by ICP DAS Co., Ltd. All rights are reserved. 2 / 12 在 Windows XP Embedded 中使用 I/O 卡 本文將介紹如何在 Microsoft Windows XP Embedded 系統中加入泓格的 I/O 卡驅動程式, 使該卡可以正確的運作 單機安裝驅動程式 第一種方式, 如同一般的 Windows XP 系統一樣, 待 Windows XP Embedded 建置完成且正常啟動之後, 直接在該系統上執行泓格提供的安裝程式即可 泓格所提供的

More information

Microsoft Word - ACG chapter00c-3ed.docx

Microsoft Word - ACG chapter00c-3ed.docx Python 好好玩, 趣學電玩遊戲程式設計 Python Python BASIC Java JavaScript PHP C++ BASIC Python Python Python Xbox PlayStation Nintendo - 2 - 簡介 : 互動式 Python Shell : 編寫程式 Python File editor : 猜數字 : 腦筋急轉彎 : 龍域 ( ) : 使用

More information

e01 1....5 1.1....5 1.1.1....5 1.1.2....6 1.1.3....8 1.1.4....9 1.1.5....11 1.1.6. /...16 1.1.7. /...19 1.1.8. /...21 1.1.9....24 1.1.10....24 1.1.11....28 1.1.12....36 1.1.13....45 1.1.14....48 1.1.15....50

More information

2016 勒索軟體白皮書

2016 勒索軟體白皮書 Botnet Botnet 1 1 2 2 5 5 6 9 10 11 11 11 12 12 12 12 12 12 13 14 2016 1989 AIDS AIDS C 189 2005 2006 TROJ_CRYPZIP.A 2011 TROJ_RANSOM.QOWA 12 2012 REVETON 2013 Cryptolocker Cryptolocker AES RSA Cryptolocker

More information

* 2

* 2 * 2 1. A 3. A 2. B A. 1. 1 2. 1 3 4 4 6 p 123456 7 bk bl bm bn 7 bo cm 9 8 cl ck bt bs br bp bq 1 2 3 4 5 6 7 8 9 bk bl bm 0 bn bo bp bq br bs bt p ck 8 2 4 6 cl cm cq cp co cn cn co cp cq 10 . [8]

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

封面-12

封面-12 第十二章 701Client TECHNOLOGY CO.,LTD. 701Client 701Server 701Client "701Client", 12-1 :supervisor :supervisor : 1. : 00~99 100 2. : 00~63 ( 63 / / ) 3. : 18 9 4. : 18 9 5. 12-2 TECHNOLOGY CO.,LTD. 701Client

More information

實作SQLiteOpenHelper類別

實作SQLiteOpenHelper類別 SQLiteOpenHelper 類別存取 SQLite 建國科技大學資管系 饒瑞佶 2013/5 V1 Android 連結資料庫 MySQL SQL Server Web Service 遠端資料庫 Internet Intranet Android SQLite 單機資料庫 Android vs. SQLite 透過 SQLiteOpenHelper 類別來操作 建立資料庫 ( 建構子 ) 建立資料表

More information

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

目 錄 一 ANDROID 開發系統需求 作業系統 開發工具... 1 二 安裝 ANDROID 開發工具 安裝 JDK 使用 APT-GET 安裝 使用套件管理程式安裝... 9 三 ANDROID 程式撰寫... 1 Android On Linux 簡易安裝開發教學 Installing Google Android SDK 2.0.1 On Ubuntu 9.10 Desktop 目 錄 一 ANDROID 開發系統需求... 1 1. 作業系統... 1 2. 開發工具... 1 二 安裝 ANDROID 開發工具... 1 1. 安裝 JDK... 1 2. 使用 APT-GET 安裝... 2 3. 使用套件管理程式安裝...

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 章.1 Android UI 基本概念 用户界面 (User Interface,UI) 是用户与设备之间进行信息交流的直接媒介, 是决定用户体验最重要的部分 相比于早期的计算机的主要交互界面 批处理界面和命令行界面, 现在更为流行的是更简单直接的用户图形界面 (Graphical User Interface, GUI) GUI 简单易用, 受众面广, 直接推动了个人计算机的发展 目前, 主流大众的操作系统都采用了

More information

麻 省 理 工 學 院 是 在 西 元 2013 年 12 月 3 日 推 出 MIT App Inventor 2 網 站, 提 供 免 費 的 雲 端 服 務, 使 用 者 可 以 透 過 瀏 覽 器 來 開 發 Android 裝 置 應 用 程 式, 該 網 站 的 網 址 為 : http

麻 省 理 工 學 院 是 在 西 元 2013 年 12 月 3 日 推 出 MIT App Inventor 2 網 站, 提 供 免 費 的 雲 端 服 務, 使 用 者 可 以 透 過 瀏 覽 器 來 開 發 Android 裝 置 應 用 程 式, 該 網 站 的 網 址 為 : http 資 訊 學 科 中 心 6 月 份 電 子 報 用 MIT App Inventor2 程 式 拼 圖 來 開 發 Android 裝 置 應 用 程 式 李 啟 龍 學 習 Android 裝 置 程 式 設 計, 可 以 不 必 學 習 較 為 艱 澀 的 Java 語 法, 只 要 使 用 拼 圖 模 式 來 組 合 程 式, 就 可 以 完 成 Android 裝 置 的 應 用 程 式 MIT

More information

投影片 1

投影片 1 數位相片基礎編修 Photoshop,,,, 2 ,, 3 / 4 3-1,...,, Photoshop,,, 5 5 6 ,,..., 5,,, 7 3-2,...,,, 8 , Photoshop,,, / 9 10 ,,,,,, 03-02.jpg,,,,, Photoshop " ", Photoshop 11 12 / /, Photoshop, 13 14 ,,, " " " " 6

More information

内文-2.indd

内文-2.indd 客户端服务端音乐资源信息 : 1. 项目需求从本项目开始, 我们一起开发一个简单的在线音乐播放器, 它具有以下功能 (1) 程序启动时显示一个启动画面, 如图 1-1 所示 (2) 在程序主页面显示服务器上的歌曲列表, 包括歌手名与歌曲名, 单击列表条目可实现在线音乐播放, 单击 播放 暂停 上一曲 下一曲 按钮可实现对应的功能, 进度条可以显示歌曲播放进度, 如图 1-2 所示 图 1-1 程序启动画面

More information

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之 臺 北 市 大 安 高 級 工 業 職 業 學 校 資 訊 科 一 百 零 一 學 年 度 專 題 製 作 報 告 ------ 以 Android 製 作 ------ ----- 連 線 塔 防 遊 戲 ------ Tower defense game using Internet technology 班 級 : 資 訊 三 甲 組 別 : A9 組 組 員 : 葉 冠 麟 (9906129)

More information

男人的大腦 女人的大腦

男人的大腦 女人的大腦 46 2014 6 498 男女大乾坤 男女的戀愛行為 男人的大腦 女人的大腦 2014 6 498 47 48 2014 6 498 女人的戀愛行為 70 900 男人的戀愛行為 8 2014 6 498 49 50 2014 6 498 對於愛與性的混淆 男女所面臨的問題 和我一樣喜歡做愛除了我, 不可以看別人相信我, 沒有問題現在, 和我做愛知道如何引燃我從不傷害我 朋友關係和性 嫉妒和占有欲

More information

Microsoft Word - ch04三校.doc

Microsoft Word - ch04三校.doc 4-1 4-1-1 (Object) (State) (Behavior) ( ) ( ) ( method) ( properties) ( functions) 4-2 4-1-2 (Message) ( ) ( ) ( ) A B A ( ) ( ) ( YourCar) ( changegear) ( lowergear) 4-1-3 (Class) (Blueprint) 4-3 changegear

More information

如何將 WinCE5.0 程式昇級為 WEC7.0 程式 平台比較 CPU PXA270 CPU AM335x CPU 型號 WP-8x3x/WP-8x4x WP-514x/WP-515x VP-25Wx WP-8x2x/WP-9x2x WP-523x VP-x23x 作業系統版本 WinCE 5.

如何將 WinCE5.0 程式昇級為 WEC7.0 程式 平台比較 CPU PXA270 CPU AM335x CPU 型號 WP-8x3x/WP-8x4x WP-514x/WP-515x VP-25Wx WP-8x2x/WP-9x2x WP-523x VP-x23x 作業系統版本 WinCE 5. 程式移植 - 如何將 WinCE5.0 程式昇級為 WEC7.0 程式 - EVC 升級 - C#, VB.net 升級 - 使用 VS2008 開發的現有專案 Sean Hsu 編輯 最後編輯日 : 2016 八月 如何將 WinCE5.0 程式昇級為 WEC7.0 程式 平台比較 CPU PXA270 CPU AM335x CPU 型號 WP-8x3x/WP-8x4x WP-514x/WP-515x

More information

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074> 程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 pengxin@fudan.edu.cn 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

2 第 章 绪 论 Internet 2.0 使 得 消 费 型 电 子 产 品 用 户 可 以 通 过 多 种 不 同 的 数 据 网 络 访 问 互 联 网 内 容 用 户 可 以 使 用 便 携 式 消 费 型 电 子 设 备, 如 智 能 手 机 触 屏 平 板 电 脑 电 子 书, 甚 至

2 第 章 绪 论 Internet 2.0 使 得 消 费 型 电 子 产 品 用 户 可 以 通 过 多 种 不 同 的 数 据 网 络 访 问 互 联 网 内 容 用 户 可 以 使 用 便 携 式 消 费 型 电 子 设 备, 如 智 能 手 机 触 屏 平 板 电 脑 电 子 书, 甚 至 . Android 是 什 么 第 章 绪 论 2 3 本 章 将 主 要 介 绍 Android 操 作 系 统, 这 些 背 景 知 识 可 以 帮 你 更 好 地 理 解 本 书 的 内 容 你 将 了 解 到, 这 一 平 台 在 如 今 以 便 携 式 消 费 型 电 子 设 备 为 基 础 的 Internet 2.0 环 境 下 是 如 何 大 显 身 手 的 这 里 所 说 的 Internet

More information

建模与图形思考

建模与图形思考 F06_c 观摩 :ContentProvider 基於軟硬整合觀點 架构與 DB 引擎移植方法 ( c) By 高煥堂 4 通用性基类 ContentProvider 基於軟硬整合觀點 的使用范例 刚才的范例里, 我们直接使用 DataPersist 类的接口来与 SQLite 沟通 本节将替 DataPersist 配上 ContentProvider 基类, 让 Client 能透过 ContentProvider

More information

運算子多載 Operator Overloading

運算子多載 Operator Overloading 函數樣板 (Function Template) 與 類別樣板 (Class Template) 講師 : 洪安 1 資料結構與 C++ 程式設計進階班 為何需要通用函數? (1/2) int abs(int x) { return (x>0)?x:-x; 取名困難不好記 float fabs(float x) { return (x>0)?x:-x; complex cabs(complex x)

More information

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378>

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378> 製表日期 : 2008 年 9 月 17 日 Mobile Java Applet 手機安裝測試報告表 已完成測試機型數量 :317 台 ; 無問題 ( 可安裝 / 可執行 ) 機型 :315 台無法使用 :2 台 ; 特殊註記機型 :2 台 廠牌 機型 測試狀況 OK 不 OK 安裝資料夾 ( 目錄 ) 備註 NOKIA N95 應用程式 NOKIA 6110 應用程式 NOKIA 3120 應用程式

More information

Microsoft Word - 投影片ch11

Microsoft Word - 投影片ch11 Java2 JDK5.0 教學手冊第三版洪維恩編著博碩文化出版書號 pg20210 第十一章抽象類別與介面 本章學習目標認識抽象類別學習介面的使用認識多重繼承與介面的延伸 抽象類別與介面 11-2 11.1 抽象類別 抽象類別的目的是要依據它的格式來修改並建立新的類別 11.1.1 定義抽象類別 定義抽象類別的語法如下 : abstract class 類別名稱 { 宣告資料成員 ; // 定義抽象類別

More information

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

Microsoft Word - 第1章 Android基本概念.docx Android 系 统 下 Java 编 程 详 解 作 者 : 华 清 远 见 第 1 章 Android 基 本 概 念 本 章 简 介 本 章 主 要 介 绍 Android 基 本 概 念 方 面 的 内 容, 包 括 Android 平 台 特 性 Android 系 统 架 构 Android 开 发 框 架 和 Android 开 发 环 境 搭 建 1.1 Android 简 介 Android

More information

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE Project Properties IDE makefile 1. Oracle Solaris Studio 12.2 IDE 2010 9 2 8 9 10 11 13 20 26 28 30 32 33 Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1. "File" > "New

More information

視窗程式設計

視窗程式設計 視窗程式設計 Windows Programming 視窗元件二 大綱 清單 (List) 下拉式選單 (Combo Box) 功能表 (Menu) 功能表處理事件 面板 (Panel) 捲軸 (Scroller) JList( 清單 ) 清單 是用來製作一連串的選項, 供使用者可以從清單中挑出所要選項, 所挑出可以有幾種方式, 例如 : JList( 清單 ) 清單的建立 使用 DefaultListModel

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 JAVA 程 序 设 计 ( 肆 ) 徐 东 / 数 学 系 使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 使 用 Java class 代 表 保 险 箱 public class SaveBox 类 名 类 类 体 实 现 封 装 性 使 用 class SaveBox 代 表 保

More information

Microsoft Word - ACI chapter00-1ed.docx

Microsoft Word - ACI chapter00-1ed.docx 前言 Excel Excel - v - 財務管理與投資分析 -Excel 建模活用範例集 5 相關 平衡 敏感 - vi - 前言 模擬 If-Then 規劃 ERP BI - vii - 財務管理與投資分析 -Excel 建模活用範例集 ERP + BI + ERP BI Excel 88 Excel 1. Excel Excel 2. Excel 3. Excel - viii - 前言 1.

More information

任务实施 (1) 创建项目 图 3-1 欢迎界面 首先创建一个工程, 将其命名为 BoXueGu, 指定包名为 com.boxuegu (2) 导入界面图片将欢迎界面所需要的背景图片 launch_bg.png 导入到 drawable 文件夹中, 项目的 icon 图标 app_icon.png

任务实施 (1) 创建项目 图 3-1 欢迎界面 首先创建一个工程, 将其命名为 BoXueGu, 指定包名为 com.boxuegu (2) 导入界面图片将欢迎界面所需要的背景图片 launch_bg.png 导入到 drawable 文件夹中, 项目的 icon 图标 app_icon.png 第 3 章注册与登录模块 学习目标 掌握欢迎界面的开发, 能够独立制作欢迎界面 ; 掌握注册和登录模块的开发, 能够实现用户登录功能 博学谷项目的注册与登录模块主要用于创建用户账号, 管理用户信息 当用户注册成功后会跳转到登录界面, 用户登录后可以修改密码以及设置密保, 且只有设置过密保的账户才可以找回密码 本章将针对注册与登录模块进行详细讲解 3.1 欢迎界面 任务综述 在实际开发中, 开启应用程序时首先会呈现一个欢迎界面,

More information

Microsoft Word - ok翁志文、張佳音...doc

Microsoft Word - ok翁志文、張佳音...doc 1 壹 研究動機 一般而言 傳統大三弦琴碼的擺放位置 圖 1 大約在琴鼓下方 由下往 上三分之一的地方 約 8.5 公分 但是這種擺法 學生在初學大三弦時 左手 常伴隨著指距較大 音準較難以掌握的困擾 為解決這個技巧上的問題 必須不 斷練習將手指指距撐開 並在琴桿上做記號來加以輔助 圖 1 傳統琴碼三分之一的擺放位置 8.5 公分 目前 北京中央音樂學院談龍建教授 採取將琴碼位置 往上移至 五度音

More information

人民邮电

人民邮电 第 2 章 布 局 布 局 是 所 有 带 界 面 的 Android 程 序 的 开 端 布 局 应 用 得 好 坏 直 接 决 定 了 程 序 的 用 户 体 验 虽 然 布 局 看 似 没 有 组 件 复 杂, 但 也 涉 及 到 了 很 多 技 巧 在 各 大 公 司 的 面 试 题 中 也 会 经 常 遇 到 关 于 布 局 的 一 些 问 题 通 过 这 些 问 题 可 以 考 查 应

More information

PowerPoint Presentation

PowerPoint Presentation Part 4 使 用 不 同 的 操 作 介 面 版 面 型 態 單 元 19 LinearLayout 版 面 型 態 單 元 20 TableLayout 版 面 型 態 單 元 21 RelativeLayout 版 面 型 態 單 元 22 FrameLayout 版 面 型 態 單 元 23 版 面 型 態 的 應 用 1 單 元 19 LinearLayout 版 面 型 態 2 LinearLayout

More information

EX-Z80

EX-Z80 C 4 6 R P r p 快速入門基礎知識 什麼是數位相機 數位相機可以將影像儲存在記憶卡中 讓您能夠不限次數地拍攝和刪除影 像 拍攝 刪除 顯示 您可以使用各種不同方式處理拍攝的影像 將影像儲存在電腦上 列印影像 9 附加影像到電子郵件 快速入門基礎知識 1. + - 2. 1. 1 2 2. 3. 2 1 * * * * * *? [8] [4] [2] [6] [SET] 1. 2.

More information

家具使用說明書_實體版2016.9

家具使用說明書_實體版2016.9 續上頁 居家甲醛對策 保持室內空氣流通 甲醛會緩慢地釋放於空氣中 因此平時就需保持室內空氣流通 尤其新居落成時 請盡量將窗子開到最大 以利通風透氣 由於室內溫度 溼度升高時 會大量釋放甲醛 在夏季或梅雨季節 室內經常長時間處於密閉狀態 請特別謹慎注意 此外 若屋內有數個窗戶時 建議保持至少2 扇窗的通風 收納家具用游離甲醛吸附紙/4入 160元 主成分為多孔天然礦石與紙漿 並添加具吸附 分解效果的胺基酸

More information

Oxford iSolution下載及安裝指南

Oxford iSolution下載及安裝指南 Oxford isolution 下載及安裝指南 Download and Installation Guide 系統要求 System Requirements... 2 Oxford isolution 安裝步驟 Windows 個人電腦 Oxford isolution Installation Steps For Windows PCs... 3 Oxford isolution 安裝步驟

More information

untitled

untitled 1 LinkButton LinkButton 連 Button Text Visible Click HyperLink HyperLink 來 立 連 Text ImageUrl ( ) NavigateUrl 連 Target 連 _blank _parent frameset _search _self 連 _top 例 sample2-a1 易 連 private void Page_Load(object

More information

中南大学第二届软件创新大赛

中南大学第二届软件创新大赛 3D 全 息 投 影 游 戏 平 台 参 赛 项 目 计 划 书 一 参 赛 作 品 构 思 的 创 意 与 价 值 1. 背 景 : 问 题 领 域 (1) 手 机 平 台 游 戏 发 展 火 爆 随 着 移 动 设 备 和 移 动 互 联 网 的 飞 速 发 展, 手 机 已 经 成 为 人 们 日 常 生 活 中 的 伙 伴 越 来 越 多 手 机 游 戏 APP 成 为 了 人 们 放 松

More information

基于ECO的UML模型驱动的数据库应用开发1.doc

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

40/60 AM Cardio 40/60 ... 4 Cardio 40/60... 4... 5... 5 :... 5... 5... 6 : Cardio 40/60... 6 / (Cardio 40)... 6 / (Cardio 60)... 6 :... 6 : GPS... 7 : Brytonsport.com... 8... 9 :... 9 GPS... 10... 11

More information

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h 資訊系統與實習 製作 : 林郁君 一 2009.09.28 9X9 'button 被按下後 ' Dim i, j As Integer For i = 1 To 9 'i 從 1 到 9' For j = 1 To 9 'j 從 1 到 9' If j * i < 10 Then ' 如果 j 乘上 i 是為個位數 ' Response.Write(i & "*" & j & " =" & i *

More information

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63> 基 于 Android 平 台 的 电 子 拍 卖 系 统 摘 要 本 电 子 拍 卖 系 统 其 实 就 是 一 个 电 子 商 务 平 台, 只 要 将 该 系 统 部 署 到 互 联 网 上, 客 户 都 可 以 在 该 系 统 上 发 布 想 出 售 的 商 品, 也 可 以 对 拍 卖 中 的 商 品 参 与 竞 价 整 个 过 程 无 须 人 工 干 预, 由 系 统 自 动 完 成 本

More information