From 6c285977a0dc9605348bd9530282c7d006cbf8bd Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 29 Aug 2011 16:53:49 -0700 Subject: Fix issues 5158104 and 4981556 (fragment problems) 5158104: com.android.contacts: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1201) The ViewPager can just commit without worrying about a state loss, since it can correctly reconstruct its state later. 4981556: Fragment.mImmediateActivity doesn't get restored on orientation change I am giving up on this thing; I just don't see how it can actually be correct. So now instead of getting an exception about a dup add/remove at point of the add/remove call, this will happen later when processing the transaction. Also add an API for controlling the visibility of menus, which ViewPager can use to have the correct menus shows. And add a method to get the name of a back stack entry. Change-Id: Idcba14cfa2a172545a7a2a2c466cb49ceb789619 --- core/java/android/app/Activity.java | 2 -- core/java/android/app/BackStackRecord.java | 29 ---------------------- core/java/android/app/Fragment.java | 40 ++++++++++++++++++++---------- core/java/android/app/FragmentManager.java | 29 +++++++++++++--------- 4 files changed, 44 insertions(+), 56 deletions(-) (limited to 'core/java/android/app') diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 1271ddd..0e3eaaa 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -4206,7 +4206,6 @@ public class Activity extends ContextThemeWrapper fragment.mContainerId = containerId; fragment.mTag = tag; fragment.mInLayout = true; - fragment.mImmediateActivity = this; fragment.mFragmentManager = mFragments; fragment.onInflate(this, attrs, fragment.mSavedFragmentState); mFragments.addFragment(fragment, true); @@ -4222,7 +4221,6 @@ public class Activity extends ContextThemeWrapper // This fragment was retained from a previous instance; get it // going now. fragment.mInLayout = true; - fragment.mImmediateActivity = this; // If this fragment is newly instantiated (either right now, or // from last saved state), then give it the attributes to // initialize itself. diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java index 93330a7..e9e8e16 100644 --- a/core/java/android/app/BackStackRecord.java +++ b/core/java/android/app/BackStackRecord.java @@ -344,10 +344,6 @@ final class BackStackRecord extends FragmentTransaction implements } private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) { - if (fragment.mImmediateActivity != null) { - throw new IllegalStateException("Fragment already added: " + fragment); - } - fragment.mImmediateActivity = mManager.mActivity; fragment.mFragmentManager = mManager; if (tag != null) { @@ -388,11 +384,6 @@ final class BackStackRecord extends FragmentTransaction implements } public FragmentTransaction remove(Fragment fragment) { - if (fragment.mImmediateActivity == null) { - throw new IllegalStateException("Fragment not added: " + fragment); - } - fragment.mImmediateActivity = null; - Op op = new Op(); op.cmd = OP_REMOVE; op.fragment = fragment; @@ -402,10 +393,6 @@ final class BackStackRecord extends FragmentTransaction implements } public FragmentTransaction hide(Fragment fragment) { - if (fragment.mImmediateActivity == null) { - throw new IllegalStateException("Fragment not added: " + fragment); - } - Op op = new Op(); op.cmd = OP_HIDE; op.fragment = fragment; @@ -415,10 +402,6 @@ final class BackStackRecord extends FragmentTransaction implements } public FragmentTransaction show(Fragment fragment) { - if (fragment.mImmediateActivity == null) { - throw new IllegalStateException("Fragment not added: " + fragment); - } - Op op = new Op(); op.cmd = OP_SHOW; op.fragment = fragment; @@ -428,10 +411,6 @@ final class BackStackRecord extends FragmentTransaction implements } public FragmentTransaction detach(Fragment fragment) { - //if (fragment.mImmediateActivity == null) { - // throw new IllegalStateException("Fragment not added: " + fragment); - //} - Op op = new Op(); op.cmd = OP_DETACH; op.fragment = fragment; @@ -441,10 +420,6 @@ final class BackStackRecord extends FragmentTransaction implements } public FragmentTransaction attach(Fragment fragment) { - //if (fragment.mImmediateActivity == null) { - // throw new IllegalStateException("Fragment not added: " + fragment); - //} - Op op = new Op(); op.cmd = OP_ATTACH; op.fragment = fragment; @@ -663,7 +638,6 @@ final class BackStackRecord extends FragmentTransaction implements case OP_ADD: { Fragment f = op.fragment; f.mNextAnim = op.popExitAnim; - f.mImmediateActivity = null; mManager.removeFragment(f, FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle); @@ -671,7 +645,6 @@ final class BackStackRecord extends FragmentTransaction implements case OP_REPLACE: { Fragment f = op.fragment; f.mNextAnim = op.popExitAnim; - f.mImmediateActivity = null; mManager.removeFragment(f, FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle); @@ -679,7 +652,6 @@ final class BackStackRecord extends FragmentTransaction implements for (int i=0; i