Android Fragment的瑣事

ps:感謝J總的鼎力相助

記錄一點關於Fragment的瑣事,給自己查閱

==================================================

在3.0以下的api裏使用Fragment要導入jar包,包在D:\android-sdk\extras\android\support\v4這位置

在eclipse要建立一個libs文件夾,將jar包放入再Add to Build Path,不然啓動會提示Class Not Found

==================================================

Fragement有一個堆棧是交給activity管理,用戶模擬後退時使用getFragmentManager().popBackStack();可以返回到堆棧的最上層

popBackStack(String , int) 和popBackStack(int , int) 具體使用方法待研究,還未使用

==================================================

Fragment替換和添加使用

// id是要放置的layout,fragment是要顯示的fragment
getFragmentManager().beginTransaction().replace(id, fragment).addToBackStack(null).commit();

添加是使用add,replace是替換

addToBackStack是添加到堆棧中,可以模擬後退返回前一個Fragment

不調用這個方法,返回的時候不會返回前一個fragment

每個事務都要調用commit來提交

每個事務要使用獨立的FragmentTransaction(沒有經過嚴謹的測試)

==================================================

Fragment的生命週期

每次進來都會經過onCreateView這個返回一個view

如果返回的view裏的數據是動態的,那麼下次返回的時候將丟失這些數據

需要對數據持久化

如果有數據源,如集合等,可以將數據源的初始化放在Fragment 的onCreate時候

如果是對象,可以保存這個對象,方法很多,onStop,或者獲取對象的時候

==================================================

如果在2個Fragment之間互相replace並且addToBackStack,那麼返回的時候會多個返回

這個問題可以利用Fragment本身的堆棧管理處理(具體方法沒想到,只有大概思路,待鑑定)

還可以對Fragment進行標識,replace之前判斷此標識

==================================================

多次replace同一個fragment會讓頁面空白,而且再次返回也無法刷新數據

要避免多次replace同一個fragment的問題,這樣的問題還沒去研究是爲什麼,待解。

懷疑自己哪裏操作失誤,或者代碼邏輯上有誤,待鑑定。

==================================================

當兩個Fragment互相replace而都沒用調用addToBackStack方法的時候

每次回到之前一個Fragment的時候,所有數據都將重新加載,Fragment的生命週期重新走一遍

需要用到上面提到的對數據進行持久化,這個時候不能在Fragment裏進行持久化的操作

==================================================

遇到最蛋疼的問題了,UI都用Fragment實現,但現在一個需求,在Fragment中嵌套一個mapView

只是局部一塊map,用mapView需要繼承MapActivity,而使用Fragment又必須繼承FragmentActivity

在網上搜了,找到網友大溼的解決之法,但不適用。

網上的方式還是重新啓動了一個MapActivity,而不是在Fragment的局部嵌套了一小塊map

如果有人知道解決之法,還請告知,不甚感激。

自己想到了其他的解決之法,根據自己的需求制定了幾種應對方法,還是挺好的,個人認爲比原來嵌套mapView好

==================================================

直接點擊返回按鈕與調用popBackStack產生的效果有些不一樣

如果Fragment背景透明的,那麼調用popBackStack返回的時候,會看到前一頁面的內容。

==================================================

如果在Fragment中使用內部類,在內部類中使用Toast或者Dialog時,使用getActivity()有些情況下會取到空

解決辦法,使用handler或者在application中定義context
==================================================

很多時候getActivity獲取到的是null,原因未知,J總說是fragment的bug,我信了。

解決方法:給Fragment構造傳參
==================================================

有時候調用replace時,而不想調用addToBackStack

就是從BFragment replace 到CFramgent而不想保留BFragment,

從C返回時,有的情況是直接返回到A,有的情況是返回B

我的處理方法是在B到C的時候,判斷B是否要保留,如果不保留,在replase之前調用popBackStack

還可以在返回的時候處理,是否保留

每次返回都會重新調用onCreateView方法,這樣在這裏判斷是否保留也可以

如果有更好的方法,歡迎提供

==================================================
使用fragment+RadioGroup做底部導航

處理了每次切換fragment都會初始化的問題

如果使用add後再使用replace,返回的時候,前一個fragment會空白

比如在AFragment中使用N個Fragment做首頁,這N個Fragment之間的切換都是使用add

在某一個Fragment中添加事件使用跳轉到下一個會覆蓋AFragment的Fragment

如果這裏跳轉使用了replace,那麼返回的時候,AFragment所展示的內容會空白,同樣使用add就可以

反之,如果在AFragment上幾個Fragment都是使用replace,那麼跳轉的時候也要用replace

應該是跟Fragment的生命週期有關,加上處理了不再重複初始化,引起這樣的問題
==================================================

待解決問題:


==================================================

其他待續...如有錯,歡迎指正


==================================================
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章