Fragment中調(diào)用getActivity為null的問(wèn)題

很多人都曾被這個(gè)問(wèn)題所困擾,如果app長(zhǎng)時(shí)間在后臺(tái)運(yùn)行,再次進(jìn)入app的時(shí)候可能會(huì)出現(xiàn)crash,而且fragment會(huì)有重疊現(xiàn)象。如果系統(tǒng)內(nèi)存不足、切換橫豎屏、app長(zhǎng)時(shí)間在后臺(tái)運(yùn)行,Activity都可能會(huì)被系統(tǒng)回收然后重建,但Fragment并不會(huì)隨著Activity的回收而被回收,創(chuàng)建的所有Fragment會(huì)被保存到Bundle里面,從而導(dǎo)致Fragment丟失對(duì)應(yīng)的Activity。

1.在前面提到的幾種情況下系統(tǒng)回收了Activity
2.通過(guò)onSaveInstanceState保存Fragment的狀態(tài)
3.用戶再次點(diǎn)擊進(jìn)入app
4.由于Activity被回收,系統(tǒng)會(huì)重啟Activity,根據(jù)之前保存的Fragment的狀態(tài)恢復(fù)fragment
5.Activity的代碼邏輯中,會(huì)再次創(chuàng)建新的Fragment
6.頁(yè)面出現(xiàn)混亂,覆蓋了兩層的fragment。假如恢復(fù)的Fragment使用到了getActivity()方法,會(huì)報(bào)空指針異常

對(duì)于上面的問(wèn)題,可以考慮下面這兩種解決辦法:

1、不保存fragment的狀態(tài):在MyActivity中重寫onSaveInstanceState方法,將super.onSaveInstanceState(outState);注釋掉,讓其不再保存Fragment的狀態(tài),達(dá)到fragment隨MyActivity一起銷毀的目的。

2、重建時(shí)清除已經(jīng)保存的fragment的狀態(tài):在恢復(fù)Fragment之前把Bundle里面的fragment狀態(tài)數(shù)據(jù)給清除。方法如下:

        if(savedInstanceState!= null)
        {
            String FRAGMENTS_TAG =  "android:support:fragments";
            savedInstanceState.remove(FRAGMENTS_TAG);

        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 懶得處理樣式了, 將就著看吧. 官網(wǎng)地址: https://developer.android.com/topic...
    Reddington_604e閱讀 1,926評(píng)論 0 1
  • 總結(jié) Fragment初始化用newInstance viewPager開(kāi)多Fragment, 考慮懶加載 get...
    我不是死胖子閱讀 845評(píng)論 0 4
  • 《Android Fragment完全解析,關(guān)于碎片你所需知道的一切》 我們都知道,Android上的界面展示都是...
    cxm11閱讀 2,376評(píng)論 2 19
  • 1 Fragment是什么? Fragment碎片,我的理解就是一個(gè)具有生命周期的容器控件,只不過(guò)Fragment...
    WangGavin閱讀 3,687評(píng)論 1 6
  • Activity的狀態(tài)保存和恢復(fù) Activity的狀態(tài)什么時(shí)候需要保存和恢復(fù) Activity的銷毀一般分為兩種...
    CP9閱讀 15,363評(píng)論 0 15

友情鏈接更多精彩內(nèi)容