編輯:Android開發教程
以前做過的一個項目,Fragment嵌套高德地圖,當再次進入Fragment的時候,會出現奇怪的現象。嵌套的地圖會出現滑動不動的情況,起先還以為是高德的bug呢,經過一番研究,終確定這是一個坑。
先對Fragment做一個簡單的介紹,借用csdn上朋友寫的一段內容。
Android在3.0中引入了fragments的概念,主要目的是用在大屏幕設備上--例如平板電腦上,支持更加動態和靈活的UI設計。平板電腦的屏幕要比手機的大得多,有更多的空間來放更多的UI組件,並且這些組件之間會產生更多的交互。Fragment允許這樣的一種設計,而不需要你親自來管理 viewhierarchy的復雜變化。 通過將activity的布局分散到fragment中, 你可以在運行時修改activity的外觀,並在由activity管理的back stack中保存那些變化。
使用過Fragment的同學都知道,它的使用相當的簡單,基本上和Activity中一樣,就是生命周期函數稍稍多了點。今天不是介紹Fragment如何使用,而是介紹一個Fragment中的一個坑。現在相當多的APP都有以下三種設計風格。
一、底部TAB,一般3-5個,點擊某個TAB,上面頁面也隨之切換,如QQ、騰訊微博、新浪微博。早期的時候Android開發者們都會使用TabActivity去實現,但是TabActivity存在一些問題,也不符合Andoid的單窗口設計的原則,所以已經被廢棄,不推薦大家繼續使用。如有業務需求,請優先考慮使用Fragement。
二、頂部TAB,一般也是3-5個左右,相對於底部TAB風格,頂部TAB一般會引入ViewPager + Fragment的實現方式,這樣可以做到左右切換,如微信。
三、側邊TAB,也就是SlidingMenu + Fragment或者MenuDrawer + Fragment。這種風格自去年起,風靡的一發不可收拾,前段時間干貨分享講的一期就是這個,代碼也開源在了Github上,有興趣的朋友可以下載了解下。出門右轉,查看歷史消息《一個比較酷的項目界面分享,干貨十足》。
上述三種風格中使用到的Fragment,一般很容易會被大家忽略了一個問題。那就是當和Fragment關聯的view hierarchy正在被移除時,不會執行onDestroy()方法,而是會調用onDestroyView()。比如上述的風格二ViewPager + Fragment,默認情況下當ViewPager滑動到第三頁的時候,第一頁的Fragment就會執行onDestroyView,當再次滑動到第二頁的時候,第一頁的Fragment的onCreateView又會重新執行繪制頁面。伴隨而來的問題就是成員變量要重新賦值一次,辛苦耗時加載出來的頁面又要重新加載一次,這樣也就給內存增加了無意思的壓力,用戶體驗上也不大友好,尤其在有網絡請求等開銷時長比較長的情況下。
那有沒有上面解決辦法呢?答案是肯定的。onDestroyView的執行和Activity的onDestroy不一樣,不會銷毀當前的頁面,所以Fragment的所有成員變量的引用都還在。那就好辦了,我們在onCreateView的時候,先判斷該取到的數據是否為空,比如Fragment的根視圖rootView,網絡請求獲取到的數據等,如果不為空就不用再次執行。這樣一來也就避免了上述說的那些問題的存在了。
返回欄目頁:http://www.bianceng.cn/OS/extra/
但是需要注意的一點就是,如果重用rootView的話,一定要記得在onDestroyView裡面把rootView先給移除掉,因為已經有過父布局的View是不能再次添加到另一個新的父布局上面的。代碼如下
這樣也就解決了最前面我遇到的那個bug,由於每次進入都會創建一個MapView,很多地圖疊在了一起,所以就出現了"滑不動"的奇怪現象。
今天分享的只是一個優化策略罷了,希望能幫助到你。
作者:cnblogs JackCho
前言:學習Android也有一年多了,目前在從事Android開發的工作。不敢說精通,但也小有心得 。相信很多android初學者和我剛開始接觸android時一樣,往往
新的系統保留了原來Jelly Bean 名字,整體用戶體驗並沒有太大的改動,不過一些新的功能還是值得大家關注的。Google Now 更新在新的Google Now 中,
如果給 Android 撰寫一個編年史,那每年的 Google I/O 都是一個新的 Android 年的開啟,它預示著 Android 在後續一年新的方向和趨勢。201
Remote Service Controller 和使用Local Service的Android ApiDemo示例解析(40):App->Service-&g