From be6f50424a14324988fb827bf09a88030a82509f Mon Sep 17 00:00:00 2001 From: sergeyv Date: Tue, 23 May 2017 15:24:37 -0700 Subject: [PATCH] Correctly save retained fragments in the backstack Test: FragmentLifecycleTest#retainedFragmentsInBackstack bug:62027280 Change-Id: I4ba20c5138f957107422c46d67095c7c8db2c608 --- core/java/android/app/FragmentManager.java | 28 ++++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 95d55dc2d6e67..3e26e0f39a107 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -2603,23 +2603,25 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1; if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f); } - boolean addedChild = false; + FragmentManagerNonConfig child; if (f.mChildFragmentManager != null) { f.mChildFragmentManager.saveNonConfig(); - FragmentManagerNonConfig child = f.mChildFragmentManager.mSavedNonConfig; - if (child != null) { - if (childFragments == null) { - childFragments = new ArrayList<>(); - for (int j = 0; j < i; j++) { - childFragments.add(null); - } - } - childFragments.add(child); - addedChild = true; + child = f.mChildFragmentManager.mSavedNonConfig; + } else { + // f.mChildNonConfig may be not null, when the parent fragment is + // in the backstack. + child = f.mChildNonConfig; + } + + if (childFragments == null && child != null) { + childFragments = new ArrayList<>(mActive.size()); + for (int j = 0; j < i; j++) { + childFragments.add(null); } } - if (childFragments != null && !addedChild) { - childFragments.add(null); + + if (childFragments != null) { + childFragments.add(child); } } }