if (!f.mAdded && newState > Fragment.CREATED) {
newState = Fragment.CREATED;
}
+ if (f.mRemoving && newState > f.mState) {
+ // While removing a fragment, we can't change it to a higher state.
+ newState = f.mState;
+ }
if (f.mState < newState) {
// For fragments that are created from a layout, when restoring from
// the fragment now should move to once the animation
// is done.
f.mStateAfterAnimating = newState;
+ newState = Fragment.CREATED;
} else {
if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
if (!f.mRetaining) {
throw new SuperNotCalledException("Fragment " + f
+ " did not call through to super.onDetach()");
}
- f.mImmediateActivity = null;
- f.mActivity = null;
- f.mFragmentManager = null;
+ if (!f.mRetaining) {
+ makeInactive(f);
+ } else {
+ f.mImmediateActivity = null;
+ f.mActivity = null;
+ f.mFragmentManager = null;
+ }
}
}
}
fragment.mRemoving = true;
moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED,
transition, transitionStyle);
- if (inactive) {
- makeInactive(fragment);
- }
}
}
}
fragments.add(f);
f.mRetaining = true;
+ f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1;
}
}
}
f.mBackStackNesting = 0;
f.mInLayout = false;
f.mAdded = false;
+ f.mTarget = null;
if (fs.mSavedFragmentState != null) {
fs.mSavedFragmentState.setClassLoader(mActivity.getClassLoader());
f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
if (nonConfig != null) {
for (int i=0; i<nonConfig.size(); i++) {
Fragment f = nonConfig.get(i);
- if (f.mTarget != null) {
- if (f.mTarget.mIndex < mActive.size()) {
- f.mTarget = mActive.get(f.mTarget.mIndex);
+ if (f.mTargetIndex >= 0) {
+ if (f.mTargetIndex < mActive.size()) {
+ f.mTarget = mActive.get(f.mTargetIndex);
} else {
Log.w(TAG, "Re-attaching retained fragment " + f
- + " target no longer exists: " + f.mTarget);
+ + " target no longer exists: " + f.mTargetIndex);
f.mTarget = null;
}
}
pw.println(" COMP_SPEC may also be a component name (com.foo/.myApp),");
pw.println(" a partial substring in a component name, an");
pw.println(" ActivityRecord hex object identifier, or");
- pw.println(" \"all\" for all objects");
+ pw.println(" \"all\" for all objects, or");
+ pw.println(" \"top\" for the top activity.");
pw.println(" -a: include all available server state.");
pw.println(" -c: include client state.");
return;
activities.add(r1);
}
}
+ } else if ("top".equals(name)) {
+ synchronized (this) {
+ final int N = mMainStack.mHistory.size();
+ if (N > 0) {
+ activities.add((ActivityRecord)mMainStack.mHistory.get(N-1));
+ }
+ }
} else {
ComponentName componentName = ComponentName.unflattenFromString(name);
int objectId = 0;