Fragment 迷航記

最近為了 "吹哨找手機" 的其中一個 bug issue,好幾天睡眠不足,每天挑燈夜戰,查遍各大論壇,雖然釐清了不少觀念,但是還是解不出來。

問題是這樣,當這 app 被 android 回收後,再重新執行會出現 ANR crash,檢查 log 會發現 No view found for id (:packageName) 之類的錯誤,雖然在上架前我用其它方法躲過 ANR,可是顯示上還是有異常。

整個佈局是 PreferenceActivity 鑲嵌 PreferenceFragment,就在剛才翻了翻 google api,才驚覺原來 Fragment 在鑲嵌進 Activity 時,有兩種方式,其一是以前用過的 getFragmentManager().beginTransaction().replace(R.id.query_container,new PrefsFragment()).commit(),另一種是用 xml 方式套入 fragment。

在 AS 開新專案時使用的是 SettingActivity 範本,預設是用 xml 嵌套的,但是原始範例是兩層的設定頁面,看不是很懂,所以改成以往的 getFragmentManager().beginTransaction().replace(R.id.query_container,new PrefsFragment()).commit() 方式在套入,但是原本範例內的 xml 嵌套仍然保留,所以才會在 android 回收 Activity 後,出現 ANR 錯誤。

解決方法就是把自作聰明的 getFragmentManager().beginTransaction().replace(R.id.query_container,new PrefsFragment()).commit() 拿掉就好了。

為了這一行失去了好幾個晚上的睡眠,天呀。


話說我還是比較喜歡從實作中學習整個概念或使用方法,要我去翻 api 再逐一驗證,要嘛是睡著,整個學習沒有衝勁看不到成果,要嘛就是放棄的早。

雖然這樣的學習方式跌跌撞撞,但也會慢慢建立起自己對這 api 的世界觀,我果然是實作派的。

-----------------------------------------------

最近做很多自打嘴巴的事情,請參考 google api 指南 Setting Preference
如果針對Android3.0 以上版本進行開發,建議使用PreferenceFragment作為設定頁面,而 Container 應該用 Activity,在 Activity 用 getFragmentManager().beginTransaction().replace(android.R.id.content,new SettingFragment()).commit(),在 Fragment.OnCreate 用 addPreferencesFromResource(R.xml.preference) 載入設定頁面。

以上...


留言

這個網誌中的熱門文章

[IIS] 自我簽署憑證來啟用SSL

相見恨晚的自動化測試開發工具 Sikuli

sqlplus 中文亂碼解決方案