原因
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);
}