詳細的Fragment初階可以參考 Developer Document

Developer document裡面的Design Philosophy提到, Fragement的設計是為了讓大尺寸的螢幕(比如說Tablet), 有更動態更彈性的UI設計, 從那個範例圖來簡單的說, 就是想達到iPad上那種Multi-panel的UI設計

在實際設計上, 似乎想要把Fragment設計成一個比較通用的design, 因此看起來比較不像是把一個Activity的話面分屍切成等份, 而是把Fragment當成UI上一個個有自己生命週期的獨立個體, 因此它的實踐未必是以Multi-panel的形態, 因此也有類似像DialogFragment的存在

如果以Web design的觀點來看, Fragment可以類比成<frame>或是<iframe>, <frame>或<iframe>可以看成一個HTML document的一個pagelet, 而Fragment也是可以看成一個Activity裡面受Activity裡的FragmentManager所管理的lightweight inner Activity, 我個人其實對Fragment這設計並不是很欣賞, 如果用它來implement multi-panel UI感覺頗tricky, 尤其在landscape/portrait轉換上, 而Fragment的角色定位似乎介於View以及Activity之間, 你可以將之看成一個有生命週期的複雜View的包裝(好拗口 = =“), 也可以把它看成一個簡易到不行的Activity, 對照ActivityGroup/LocalActivityManager來說, Fragment/FragmentManager 雖然顯得相對的light, 但特別為了這些目的把FragmentManager給整進Activity內, 感覺只是肥化Activity而已

Fragment並不是implement multi-panel UI的唯一途徑, Romain Guy有一個叫做x-large demos/PhotoAlbum的範例, 在這範例中, 他實作了一個Multi-panel based的Album, 但卻沒有用到任何一個Fragment

在初看到這個API時讓我比較感興趣的是, 目前在Android market上已經有相當多的phone based的軟體了, 如果是要把自己原有的架構在Phone based的軟體轉成同時也支援Fragment架構的tablet軟體(就兩者通吃), 在code的重用性, 以及porting的effort到底大不大? 

基本上, 這也不是太大的問題, 只是要把原本Activity裡面的東西抽出變成一個Fragment來implement, Activity變成只是Fragment的封裝

例如說, 原本的layout假設是 main.xml, Activity裡面原本是以

setContentView(R.layout.main)

把原本的layout抽出獨立成另一個layout, 比如說mylayout.xml, 並新增一個新的Fragment(比如說叫MyFragment), 原本的main.xml內容改成:

MyFragment只要implement onCreateView:

這樣Activity跑起來就跟原本還沒用Fragment沒啥兩樣…呃, 那這樣還多此一舉用Fragment幹嗎? 其實這只是一個簡單的靜態範例, 新創造出來的Fragment, 還可以重複在別的Activity被使用(比如說一個for tablet 的multi-panel activity), 也可以動態被創造出來應用

剛把整個電腦重灌, 所以趁這機會加強一下自己的Chrome browser, 找了幾個extension, 還不錯, 推薦一下:

以下兩個是對Android developer應該蠻實用的:

1. Android reference search

直接上SDK網站找API reference其實也還蠻方便的, 不過有時候真的就懶的切換頁面了, 如果直接可以從URL bar去search倒也蠻方便的, 這個extension就是這樣一個工具, 在網址列打入ad, 就可以發現 “Search Android SDK docs for ”, 打入你要搜尋的class name, 馬上就可以看到相關的了

2. Context search for Android developers

選取文字按下右鍵搜尋也是蠻有用的, 所以這套extension就是應用在這方面:

在HoneyComb之前Android widget是不support list view, grid view (泛稱Adapter view), 但HoneyComb引入了

不出所料, 還是只是延伸了RemoteViews, 剛在SDK level “11"看到這個RemoteViewsServices, 在onGetViewFactory要回傳RemoteViewsService.RemoteViewsFactory, 基本上這Class就跟Adapter, 差不多, 只是更簡化

期待sample codes好了, 相信這應該不會只應用在Tablet

在Android裡, 做IPC(Inter process call)的方法有很多種, 可以寫一個Intent receiver接收來自於另一個process的Intent, 也可以自己用AIDL定義interface來做

不過用Receiver的方式, intent會先跑到system server在送到目的地去, 而且Receiver的角色有點像是一對多, 不是很經濟, 至於AIDL, 實在太麻煩了, 對於簡單的應用, 或是懶人來說….只有兩個字….“麻煩”

所幸, 還有一個東西: Messenger

這東西可以讓你對目標的Handler發送message…對, 沒錯, 就是對另一個process的Handler發送message, 感覺好像很神奇, 一般不都是對同一個process的Handler發送message, 這個卻可以對remote, 但說穿了很簡單, 它只是先用AIDL定好了送message的interface而已

使用的方法很簡單, 以下是Service端:

只要在onBind的時候把Messenger的Binder回傳回去就好

Client端也很簡單, 把service給bind上, 然後用binder來創建Messenger, 這樣對Messenger送的message自然就會透過binder丟到遠端的process去了

那, 可以雙向溝通嗎? 其實是可以的….Message這class有個member: replyTo, 它就是一個Messenger, 把Messenger也附帶一起傳過去, 自然就可以做雙向溝通了

本來這技巧應該沒啥用上, 不過最近一台開發的機器, usb一直不通不通的, adb logcat自然就不能用了, 不過好在現在adb有支援adb over tcpip

啟用的方法是

adb tcpip port

這就會把手機上的adb轉成可以透過tcpip連接

不過, USB不通又怎下這指令, 當然是沒辦法….

所幸Market上下載的到相關的程式:

  1. adbWireless
  2. adb over wifi widget

我比較喜歡adb over wifi widget, 只要按一下就可以enable/disable, IP/PORT還直接顯示在widget上, 還蠻方便的

啟動之後, 只要在PC端下

adb connect IP:PORT

這樣adb就會連結到這台手機上了, 之後下adb command像是adb logcat或是adb install都是透過tcpip連結到這台機器上