課程2C的內容主要是練習鞏固2A、2B中講解的內容,並設計實現一款籃球比賽的計分板應用及其界面的美化。 ...
課程2C-實踐:創建互動式應用
概述
- 課程2C的內容主要是練習鞏固2A、2B中講解的內容,並設計實現一款籃球比賽的計分板應用及其界面的美化。
Warm-Up:準備活動
新建項目PracticeSet2(包名android.example.com,Minimum SDK:API 15,Empty Activity),主要練習了int型變數的聲明和初始化。
這部分練習要想實現的功能是計算一個人一周的睡眠時間與推薦值之間的差距。課程中的代碼計算過程有一個邏輯錯誤:只計算了一個工作日(weekday)的睡眠時間,而漏掉了剩下4天工作日的睡眠時間。
課程中介紹:通過手動模擬程式運行(hand simulation)的方法,可以幫助程式員避免邏輯錯誤。主要的思路是比較"what the program does"與"what we actually do"接下來的一些練習有計算通勤者花在路上的時間、計算購物清單總價等等,它們都是為了幫助初學者修複或者避免代碼中的邏輯錯誤。
第三部分(Part 3)的練習的主題是作用域(scope)。在HealthyLiving(健康生活)這一塊兒的練習中,解釋了為什麼不使用全局變數:a)使用到當前變數的地方並沒有跨方法(即該變數只在一個方法中用到);b)該變數存儲的是一些中間值,更新的頻率很高,不適於共用,因此也就不適於使用全部變數;3)可以避免錯誤:濫用全局變數的話,有可能引入副作用(side effects,在程式設計的語境中,表示發生了程式員不知道且不期望的行為)。即全局變數的值可能在其他地方“不小心”地被更改了,從而引入BUG。
關於全局變數與局部變數的選取問題,有一個基本原則:僅在必要的時候使用全局變數。一個簡單的判斷方法是,當你發現不用全局變數無法實現期望的功能時,就說明此時全局變數的使用應該是必要的。
CourtCounter:籃球計分板應用
a) 首先介紹了一些新的Android XML屬性,TextView控制項的gravity屬性:指定文本的對齊方式,如“水平居中”、“垂直居中”等。
b) 關於padding(內邊距)的提示:在Button控制項中,如果指定了過大的padding值,那麼按鈕本身也會變大! 所以,最好使用margin(外邊距)屬性來控制界面佈局中控制項之間的邊距。
c) 引入按鈕單擊事件的響應函數:把.xml與.java文件聯繫起來。
d) 開啟Android Studio中的Auto Import功能:可以自動在寫代碼的時候引入相關的Java Package,提高開發效率。
e) 實現更新隊伍得分的邏輯:推薦先寫一寫偽代碼,理清思路再動手寫代碼,往往比想清楚之前直接coding更有效率(雖然這樣的結論看起來有些反直覺)。
做完了以上的步驟,我們得到了Team A的計分板界面,在Android Studio中的界面預覽如圖1所示,在手機上運行的效果如圖2所示。
f) 增加另一個隊伍Team B之後的界面,用到了嵌套視圖組來實現,要是想不清楚如何嵌套,可以先畫畫層級關係的樹狀圖。新增的Team B的界面在層級關係上與Team A的界面是兄弟關係(siblings)。
g) 重置記分牌:在界面底部居中的位置,增加一個重置記分牌的比分的按鈕,需要再次嵌套視圖組。從View Groups層級關係上來講,這裡的Button所在的視圖組與前Team A、B的視圖組也是兄弟關係(siblings)。
h) 美化界面:通過直接在XML中指定16進位的顏色值,增加Team A、B的分隔線,調整padding與margin,修改使用的字體等方法,來美化之前的界面。由於我手機的API Level 為19,無法運行界面美化後的程式,這裡只放出界面Preview。