Activity被系統銷毀造成的Fragment混亂的問題


轉自 CSDN  huidawoxiaozi

大多數App主頁底部都會有幾個tab頁面,用Activity+Fragment或者Activity+Vierpager+Fragment來管理Tab頁面(由於viewpager的加載機制所以不會出現這個問題),當程序長期在后台由於系統資源不足就把MainActivity回收了或者從MainActivity點進去的activity報錯了點擊back回到MainActivity fragment也會混亂,主要是由於fragment的狀態還保存着,但是add()和hide() show()方法已經失效了,分析好原因,我們就可以解決了。

在MainActivity被銷毀或者在后台等情況下會調用onSaveInstanceState方法來保存狀態,所以做個標記outState.putBoolean("isMainActivityDestroy",true);應為被銷毀會重新調用onCreate方法,所以你if(savedInstanceState!=null&&savedInstanceState.getBoolean("isMainActivityDestroy",false))滿足這個條件就去移除之前fragment狀態,重新add fragment。看代碼你會更了解;

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragmentManager = getSupportFragmentManager();
        if(savedInstanceState!=null&&savedInstanceState.getBoolean("isMainActivityDestroy",false)){
            //當activity被系統銷毀,獲取到之前的fragment,並且移除之前的fragment的狀態
indexFragment = (IndexFragment) fragmentManager.findFragmentByTag("flag1");
            buyGoldFragment = (BuyGoldFragment) fragmentManager.findFragmentByTag("flag2");
            discoveryFragment = (DiscoveryFragment) fragmentManager.findFragmentByTag("flag3");
            mineFragment = (MineFragment) fragmentManager.findFragmentByTag("flag4");
            fragmentManager.beginTransaction().remove(indexFragment).commit();
            fragmentManager.beginTransaction().remove(buyGoldFragment).commit();
            fragmentManager.beginTransaction().remove(discoveryFragment).commit();
            fragmentManager.beginTransaction().remove(mineFragment).commit();
        }
setContentView(R.layout.activity_main);
       
        //創建fragment,並且全部add一遍
indexFragment = new IndexFragment();
        buyGoldFragment = new BuyGoldFragment();
        discoveryFragment = new DiscoveryFragment();
        mineFragment = new MineFragment();
        fragmentManager.beginTransaction().add(R.id.linear_fragment, indexFragment,"flag1").commit();
        fragmentManager.beginTransaction().add(R.id.linear_fragment, buyGoldFragment,"flag2").hide(buyGoldFragment).
                add(R.id.linear_fragment, discoveryFragment,"flag3").hide(discoveryFragment).
                add(R.id.linear_fragment, mineFragment,"flag4").hide(mineFragment).commit();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
       super.onSaveInstanceState(outState);
       outState.putBoolean("isMainActivityDestroy",true);
    }

這樣就會重新創建Fragment的狀態,add() show() hide() 也就重新起作用了

 

本質的原因是因為在Activivty在銷毀時並沒有導致Fragment的變化,Fragment的生命周期和Activity的生命周期並未同步,所以會出現問題,至於解決方案可以根據具體需求來做。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM