fragment+radiogroup實現Android底部導航出現fragment重疊分析解決

fragment+radiogroup實現Android底部導航出現fragment重疊分析解決

  • fragment+radiogroup實現底部導航原理
    當我們進入Activity時,首先展示第一個頁面,即創建對應Fragment實例,使用add+show方法顯示出來,當我們點擊進入別的頁面時,調用hide方法將已展示的Fragment頁面隱藏(實際是設置Visiable屬性爲不可見),然後顯示對應Fragment頁面(已創建則直接調用show方法,未創建則創建,然後調用add+show方法顯示)。

  • fragment重疊的出現
    當fragment依附的activity銷燬(橫豎屏切換、APP奔潰、被系統回收等)後,重新打開APP就會出現fragment重疊的現象

  • fragment重疊的原因解析
    Activity會銷燬後重建,這個過程屬於異常情況下的生命週期,系統會調用onSaveInstanceState和onRestoreInstanceState方法保存並恢復Activity的狀態,而Fragment也在恢復的內容之中。但是在之前的Activity中我們創建了Fragment的實例,並且add到FragmentTransaction中了,這些實例在Activity重建時並沒有remove,只不過Activity重建之後,沒有對象指向它們,也就是說,在重建後的Activity中,我們創建的3個fragmeng對象是指向null的。
    當我們再次創建activity時會重新新建三個fragment,並默認顯示,這樣就會和銷燬前的fragment重疊在一起。

  • fragment重疊解決方案
    ①不保存activity的信息
    我們可以直接註釋掉super.onSaveInstanceState(outState);
    這樣一來activity就不會保存信息了,但是當屏幕旋轉時,每次都會跟重新打開一樣。如果你旋轉屏幕之前顯示的是noticeFragment時,屏幕切換後就會自動切換到默認的homeFragment上。這並不是我們想要的結果。
    在onSaveInstanceState(outState)中去保存fragment,當activity被恢復時,取出這些fragment

 //保存fragment對象
 @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (homeFragment != null) {
            getSupportFragmentManager().putFragment(outState, Constants.HOME_FRAGMENT_KEY, homeFragment);
        }
        if (publishFragment != null) {
            getSupportFragmentManager().putFragment(outState, Constants.PUBLISH_FRAGMENT_KEY, publishFragment);
        }
        if (myFragment != null) {
            getSupportFragmentManager().putFragment(outState, Constants.MY_FRAGMENT_KEY, myFragment);
        }
        super.onSaveInstanceState(outState);
    }

//恢復保存的activity
private void restoreFragments(Bundle savedInstanceState) {
        FragmentManager sfm = getSupportFragmentManager();
        homeFragment = (HomeFragment) sfm.getFragment(savedInstanceState, Constants.HOME_FRAGMENT_KEY);
        myFragment = (MyFragment) sfm.getFragment(savedInstanceState, Constants.MY_FRAGMENT_KEY);
        publishFragment = (PublishFragment) sfm.getFragment(savedInstanceState, Constants.PUBLISH_FRAGMENT_KEY);

        if (!fragments.contains(homeFragment)) fragments.add(homeFragment);
        if (!fragments.contains(publishFragment)) fragments.add(publishFragment);
        if (!fragments.contains(myFragment)) fragments.add(myFragment);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章