2009年8月24日 星期一

Android 原始碼徹底研究系列 - 鬧鐘程式, Gallery & Adapter (3)

Android Source Code Internals - Alarm Clock, Gallery & Adapter (3)

在 AlarmClock 這個程式中,點一下主畫面上的時鐘,他會在下面列出一些鐘面圖樣,讓使用者更換時鐘的鐘面。上圖,就是這個選擇鐘面功能的執行畫面。水平拖移底下的鐘面清單,你可以看到上面的時鐘也會跟著換成新的鐘面。

這次我們就花點時間來研究看看,這樣的功能是如何實現出來的。

要追蹤這樣的功能是如何實現的,還是得先從主畫面的 layout 設計檔著手。打開 res/layout/alarm_clock.xml 檔案,你可以發現主畫面的時鐘應該是放在 clock_layout 這個 LinearLayout 中。

因此接著,我們打開主畫面的 Activity 檔 AlarmClock.java ,尋找 clock_layout 這個關鍵字。果然在 #234~#241 中,發現如下的程式片段:

原來,這個選擇鐘面的功能,是由 ClockPicker 這個 Activity 所負責實現的。

接著,在 ClockPicker 的 onCreate() 函式中,我們可以知道這個 Activity 所使用的畫面設計檔就是 res/layout/clockpicker.xml

同樣地,只要觀察這個 clockpicker.xml layout 設計檔,你可以發現原來選擇鐘面畫面下的鐘面清單,就是由 Gallery 這個元件所實現出來的。

原來,Galley 不僅僅用來顯示圖片,他也可以用來當成類似 horizontal ListView ,當成一種選單元件的功能。

先查看一下 Gallery 的繼承樹,原來他也是從 AdapterView 繼承下來。因此要對 Gallery 客製化,方法應該和 ListView 相同。

在 Android 中,所有的 AdapterView 子類,都允許你透過繼承 BaseAdpater 的方式,塞一個自己客製化過的 Adapter 給 AdapterView。

要如何寫一個自己的 Adapter?有興趣繼續研究的你,建議你打開這個不到 120 行的程式,ClockPicker.java,好好讀一下。

3 則留言:

匿名 提到...

老師 :
請問一下 使用analog clock此物件 照source code看來永遠就是顯示當前目前的系統時間 若想自行針對該物件設定想顯示的時間(比如多國時間這種應用) 是否有什麼方式 或建議的方法來達成此目的呢 比如可能畫面上想顯示兩個類比時鐘 一個顯示台灣時間 令一個顯示美國時間等

samlu 提到...

目前的實作都是抓取當前的時間,要顯示其他時區的時間,當然可以,你都有 source code 了,就直接改吧!

Unknown 提到...

請問老師,原始碼的檔案我點下去都是連結不成功。是檔案不存在了嗎?
如果方便可以寄給我一份嗎?謝謝你。

張貼留言