1. 程式人生 > >Android Fragment資料儲存問題

Android Fragment資料儲存問題

Fragment這個東西在3.0出來以後,一直在不斷的進步,谷歌方面也在鼓勵開發者多使用fragment,我最近看到一篇關於最佳實踐文章(說起來,在stackOverFlow上看到說,the best practice is using your brain,大概就是這個意思),也說最好是用fragment呈現資料,activity用來管理fragment。相信大家在使用fragment的時候,比較頭痛的一點就是fragment的資料儲存和回覆問題,我最近呢也稍微寫了寫,決定作個記錄,一方面是加深記憶,另外如果能為大家解決問題那就最好了。

這篇文章最主要講兩個方面,一是關於切換螢幕方向的,二是關於兩個fragment之間切換的。

首先是關於切換螢幕方向,大家都知道切換螢幕方向以後,activity會重新走一遍生命週期的函式,這應該是谷歌方面為了讓切換方向以後activity有機會換一個layout,既然是這樣,那fragment也就跟著activity重新走了一邊生命週期,有些資料也就不會保持了,注意這裡是有一些,像editText這樣的,資料依舊會保持,但是textView這樣的就不會了,想要保持資料也很簡單,重寫fragment裡的onSaveInstanceState這個函式就可以了,這個函式的作用和activity的onSaveInstanceState一樣,在切換螢幕方向,按下Home鍵等等時候都會呼叫,直接利用裡面的Bundle引數儲存資料,然後在onCreate,onCreateView這些函式裡恢復就可以了。第二種方法是在manifest裡對當前activity設定configChanges,我看網上很多文章,都說是設定"orientation|keyboardHidden",這個在4.0以後的系統中是沒用的,4.0以後要設定成"orientation|screenSize",注意了!這樣一來,螢幕切換的時候,activity就不會重新走一遍生命週期函數了,而是呼叫onConfigurationChanged這個函式,想要做什麼在這裡面寫就可以了。當然了,還有一種方法,那就是強制activity不能切換螢幕方向。

第二個問題是關於兩個fragment之間切換的,fragment的切換是通過fragmentTrasaction來管理的,具體(或者說簡單?)來說,一種是用replace來替換,還有一種是通過hide和show來替換。一開始我覺得也就是重寫onSaveInstanceState這個函式就可以了,但是後來發現用了replace之後,根本不會呼叫這個函式。。真坑。所以就想著用hide和show來做替換,這樣資料就能保持了,但是又會有一個問題,如果你把你的APP置於後臺很久,你重新切回去會發現fragment會出現重疊的現象,這是因為當你的APP置於後臺很久之後,系統會回收,你切回去,activity又會重新走一邊生命週期,在onCreate的時候重新建立一個fragment,而之前那個fragment也會被帶到前臺,所以就出現了重疊。至於之前那個fragment為什麼會帶到前臺,這我不是很確定,看過兩篇文章,說是當activity被回收之後,frgament等資料被儲存到了savedInstanceState這個Bundle中,當切回去以後,activity會通過反射呼叫儲存的fragment的無參建構函式來重新初始化。解決這個問題的方法就是判斷一下savedInstanceState這個引數是否為null,如果是null,就建立一個fragment,如果不是null,就通過fragmentTrasaction的findFragmentByTag來尋找到之前的那個fragment,當然能找到的前提就是在add的時候加tag,mTransaction.add(R.id.container,mFragment,"fragment1"); 類似這樣。