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);
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容