關於這主題, Dianne Hackborn已經在這講的很詳細了, 這邊挑了一些要點

Duo panel的設計在iPad上已經是蠻常見的了, 這設計的一個特點是, 在Landscape模式時為了充分利用空間, 把Panel切割成兩部分, 但使用者轉換成Portrait時, 則會轉換成Single panel

不意外的, 在Android上實現Duo panel的方式是可以利用Fragment的

在Hackborn的範例中, 總共有兩個Fragment (TitlesFragment, DetailsFragment) 和兩個Activity (FragmentLayout - 這邊姑且稱之為main activity, DetailsActivity), 這部份的codes可以在ApiDemos裡面找到

在main activity的layout設計上面, 為了達到Portrait是single panel而Landscape是duo panel的設計, 其實是要portrait跟ladscape分開各一種layout, 在landscape是要包含左右兩邊的Fragment, 但portrait就只能包含左邊的

因此, 在portrait mode時main activity由於不會有右邊的panel的ID, 所以必須自行偵測右邊是否存在(或是偵測目前是不是在portrait), 然後決定按下list item的行為, 如果是portrait, 就不能使用DetailsFragment去取代右邊panel, 取而代之的必須呼叫DetailsActivity來顯示, 這作法其實頗為tricky, 而且在這作法下, 懶惰的programmer再也不能overrride onConfigurationChange來偷懶了, 對於習慣不好的programmer應該是蠻容易在Orientation change這邊產生side effects

上面就是利用不同的Orientation方向判斷到底是用DetailsFragment取代右邊Panel還是呼叫DeatilsActivity, 而DetailsActivity其實就只是一個DetailsFragment一個包裝, 也就是當在landscape時, 本來就只有main activity左右兩個Fragment, 在portrait時, 這兩個Fragment被拆開成兩個Activities, 但如果這時候從portrait的DetailActivity轉回landscape要怎回到原本main activity的duo panel型態呢? 作法很簡單(也有點tricky), 在lands cape mode時, DetailsActivity就把自己給finish掉了, 不過這邊要能夠確定history stack的前一個的確是main activity, 不然也會很怪的(一般應該都會是才對)

在Hackborn的範例中, 每次都得重新建立一個新的DetailsFragment, 這樣的缺點是, 每次花在DetailsFragment初始化還有inflat layout的時間會有點浪費, 如果是在複雜的layout跟Fragment, 這樣容易造成許多不必要的垃圾, 當然能夠reuse最好, 如果把她用的replace換成這個replace, 自己給個tag, 那之後就可以用FragmentManager.findFragmentByTag將這個Fragment instance給取出重複利用, 但, Fragment是不可以被重複加入的, 你可以拿instance出來重複使用但如果試圖把這個instance重複給FragmentTranscaction, 那是會發生錯誤的

附記: 如果沒去設定target sdk version是11的話, 那這個應用程式會被當做是小螢幕的而不是一個tablet application, 此時你看到的會是在中間一個縮小版的(學iPad也不要學這麼像嘛… = =“)

不知道為啥那天看到了誠品寄來的廣告, 一時之間就想買這本書, 也顧不得剛領到公司發的金石堂禮券, 一下班就衝誠品去買, 而且居然才是當天上架的新書, 我找半天還找不到, 還拜託小姐幫我找的

See and download the full gallery on posterous

這是一本小說, 但也不全然是小說, 寓意頗深, 但卻不深奧, 藉由一個追隨一個來路不明的賣夢想的先知的追隨者的角度, 來販賣作者自己的哲學思想, 挺有哲學深度的一本小說

故事的開始是由兜售夢想的先知救了一個企圖自殺的大學教授開始, 整篇故事是以這位社會地位高, 但卻尋求不到自我的大學教授描述他所追隨的這位先知的過程, 從救了大學教授開始, 先知一個個累積了不同的"門徒", 每個人有不同的背景, 不同的"故事", 藉由這些故事來導入先知自己的哲學觀念(其實先知應該是作者本身的映射), 先知就像是耶穌一樣四處散播理念, 但這書講的不是宗教, 卻含有一種悲天憫人的思考

最近常常在思考, 自己在這裡, 在這團體裡面, 我到底是誰, 我到底是扮演什麼角色, 我的所作所為到底是為了誰? 還是為了什麼? 到底帶給人家什麼好? 又帶給人家什麼壞? 我的夢想到底是什麼? 到底我還有沒有能力實現我的夢想?

這本書, 正好跟我跟我最近一直在心裡的打的結有接軌, 雖然說沒看完後馬上就把結打開, 但還是有點心有戚戚焉的感覺

這邊分享一些書中的好句吧

“世界是一座巨大的精神病院, 而群眾是住在裡面的瘋子”

“我是個正常人, 就跟其他的正常人一樣慣於隱藏自己的瘋狂”

“即便做了蠢事還能大笑的人是幸福的人”

“社會上有很多土狼跟老鷹, 但是, 體型大的動物並不見得比較值得信賴”

“你不必恐懼人們說的話, 真正可怕的是自己的想法”

“當我們甘願渺小才能成為強者”

“什麼是典型的美麗? 不就是把一些天生基因素質比別人優秀的人拿來當做標準?”

“美麗是屬於所有的女性, 美麗不能被典型化的”

“縱然金錢本身並不能帶來幸福, 但沒有金錢可能也保不住幸福, 金錢本身並不盲目, 是我們自己對金錢的過度執著毀了平穩的生活, 沒有了錢會變得貧窮, 但是金錢的使用不當卻會讓我們淪為卑賤”

“社會以競爭為藉口, 連他們僅剩的最後一滴血也吸乾抹淨”

詳細的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), 也可以動態被創造出來應用

糟糕, 這個應該就是指我了.. XD

會想去找這些是因為用了Android上的一個Browser - Skyfile, 覺得上面的Facebook整合很不賴, 尤其是Like和Popular, 一個可以讓你對任何的網頁使用Facebook like, 一個是讓你知道其他人對這網頁說了些什麼

當然在Chrome上也可以找到類似的Ext

1. Facebook for Google ChromeQuickrr Facebook like

第一個是把Facebook的News feed整合到那個button上, 一按下來就可以看到你最新的News feeds

而Qucickrr Facebook like則是可以讓你對任何URL說"讚"啦!

2. BuzzGrowl for Twitter and Facebook

這個是讓你知道你目前正在看的網頁, 別人對它有啥看法(Facebook, Twitter上), 基本上, 這東西比較討厭的地方就是會佔住右下角的空間

剛把整個電腦重灌, 所以趁這機會加強一下自己的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就是應用在這方面: