diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/Activity.java | 4 | ||||
| -rw-r--r-- | core/java/android/app/FragmentManager.java | 14 |
2 files changed, 17 insertions, 1 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 6fc60e9eaaf2..95dc52dea79a 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2820,7 +2820,9 @@ public class Activity extends ContextThemeWrapper return; } - if (!mFragments.getFragmentManager().popBackStackImmediate()) { + FragmentManager fragmentManager = mFragments.getFragmentManager(); + + if (fragmentManager.isStateSaved() || !fragmentManager.popBackStackImmediate()) { finishAfterTransition(); } } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 8ad7810a13e8..977931a66e1e 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -397,6 +397,19 @@ public abstract class FragmentManager { public void invalidateOptionsMenu() { } /** + * Returns {@code true} if the FragmentManager's state has already been saved + * by its host. Any operations that would change saved state should not be performed + * if this method returns true. For example, any popBackStack() method, such as + * {@link #popBackStackImmediate()} or any FragmentTransaction using + * {@link FragmentTransaction#commit()} instead of + * {@link FragmentTransaction#commitAllowingStateLoss()} will change + * the state and will result in an error. + * + * @return true if this FragmentManager's state has already been saved by its host + */ + public abstract boolean isStateSaved(); + + /** * Callback interface for listening to fragment state changes that happen * within a given FragmentManager. */ @@ -1787,6 +1800,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } } + @Override public boolean isStateSaved() { return mStateSaved; } |
