Fragment重疊解決方案和原因

原因

Activity異常銷毀重新創建,一方面恢復了之前的Fragment,又重新加載Fragment,所以導致重疊

FragmentActivity異常銷毀時保存了Fragment的狀態:

   static final String FRAGMENTS_TAG = "android:support:fragments";
   @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        markState(getSupportFragmentManager(), Lifecycle.State.CREATED);
        Parcelable p = mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable(FRAGMENTS_TAG, p);//保存了fragment
        }
     }

FragmentActivity重新創建時:

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            mFragments.restoreAllState(p, nc != null ? nc.fragments : null);//還原Fragment
        }
  }

解決方案

在Activity的onCreate方法調用父類onCreate方法之前移除key為FRAGMENTS_TAG的fragment數據

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //必須在super 之前調用,不然無效。因為那時候fragment已經被恢復了。
        if (savedInstanceState != null) {
            // FRAGMENTS_TAG
            savedInstanceState.remove("android:support:fragments");
            savedInstanceState.remove("android:fragments");
        }
        super.onCreate(savedInstanceState);
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容