diff options
| author | 2011-03-22 11:35:22 -0700 | |
|---|---|---|
| committer | 2011-05-19 13:44:40 -0700 | |
| commit | 19e748a3d1702f911476e103b590a36adefb83ca (patch) | |
| tree | 028f40a2c8ff26baaed0e5ec09709c34907628e9 | |
| parent | b7ec3e41a6b3423d1669ae784a8ad8fbe32df29d (diff) | |
DO NOT MERGE: Add custom fragment anims for popping backstack
The previous fragment implementation allowed for animations
during fragment transitions, but did not account for the
different behavior of fragments when popping the back stack.
In general, you probably don't want to run the same animation
for putting a fragment on the stack as for popping it off, which
is what happens now. For example, you might fade a fragment out when
putting it on the stack. But when popping ot off, fading it out
is probably not the behavior you want.
The new API (setCustomAnimations() overload with two additional
parameters) allows developers to specify animations to be run
in the popping operation. Otherwise, the animations are null and
the operation will not be animated.
Change-Id: I53bbc6e6ec4e953b7ecdd99e2452d81857917de2
| -rw-r--r-- | api/current.xml | 19 | ||||
| -rw-r--r-- | core/java/android/app/BackStackRecord.java | 30 | ||||
| -rw-r--r-- | core/java/android/app/FragmentTransaction.java | 14 |
3 files changed, 60 insertions, 3 deletions
diff --git a/api/current.xml b/api/current.xml index e669a990973c..3a642f6425a8 100644 --- a/api/current.xml +++ b/api/current.xml @@ -31483,6 +31483,25 @@ <parameter name="exit" type="int"> </parameter> </method> +<method name="setCustomAnimations" + return="android.app.FragmentTransaction" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="enter" type="int"> +</parameter> +<parameter name="exit" type="int"> +</parameter> +<parameter name="popEnter" type="int"> +</parameter> +<parameter name="popExit" type="int"> +</parameter> +</method> <method name="setTransition" return="android.app.FragmentTransaction" abstract="true" diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java index 09e3d76e82c6..e5a7980b0c8c 100644 --- a/core/java/android/app/BackStackRecord.java +++ b/core/java/android/app/BackStackRecord.java @@ -43,7 +43,7 @@ final class BackStackState implements Parcelable { if (op.removed != null) numRemoved += op.removed.size(); op = op.next; } - mOps = new int[bse.mNumOp*5 + numRemoved]; + mOps = new int[bse.mNumOp*7 + numRemoved]; if (!bse.mAddToBackStack) { throw new IllegalStateException("Not on back stack"); @@ -56,6 +56,8 @@ final class BackStackState implements Parcelable { mOps[pos++] = op.fragment.mIndex; mOps[pos++] = op.enterAnim; mOps[pos++] = op.exitAnim; + mOps[pos++] = op.popEnterAnim; + mOps[pos++] = op.popExitAnim; if (op.removed != null) { final int N = op.removed.size(); mOps[pos++] = N; @@ -101,6 +103,8 @@ final class BackStackState implements Parcelable { op.fragment = f; op.enterAnim = mOps[pos++]; op.exitAnim = mOps[pos++]; + op.popEnterAnim = mOps[pos++]; + op.popExitAnim = mOps[pos++]; final int N = mOps[pos++]; if (N > 0) { op.removed = new ArrayList<Fragment>(N); @@ -179,6 +183,8 @@ final class BackStackRecord extends FragmentTransaction implements Fragment fragment; int enterAnim; int exitAnim; + int popEnterAnim; + int popExitAnim; ArrayList<Fragment> removed; } @@ -187,6 +193,8 @@ final class BackStackRecord extends FragmentTransaction implements int mNumOp; int mEnterAnim; int mExitAnim; + int mPopEnterAnim; + int mPopExitAnim; int mTransition; int mTransitionStyle; boolean mAddToBackStack; @@ -243,6 +251,11 @@ final class BackStackRecord extends FragmentTransaction implements writer.print(prefix); writer.print("enterAnim="); writer.print(op.enterAnim); writer.print(" exitAnim="); writer.println(op.exitAnim); } + if (op.popEnterAnim != 0 || op.popExitAnim != 0) { + writer.print(prefix); + writer.print("popEnterAnim="); writer.print(op.popEnterAnim); + writer.print(" popExitAnim="); writer.println(op.popExitAnim); + } if (op.removed != null && op.removed.size() > 0) { for (int i=0; i<op.removed.size(); i++) { writer.print(innerPrefix); @@ -301,6 +314,8 @@ final class BackStackRecord extends FragmentTransaction implements } op.enterAnim = mEnterAnim; op.exitAnim = mExitAnim; + op.popEnterAnim = mPopEnterAnim; + op.popExitAnim = mPopExitAnim; mNumOp++; } @@ -430,8 +445,15 @@ final class BackStackRecord extends FragmentTransaction implements } public FragmentTransaction setCustomAnimations(int enter, int exit) { + return setCustomAnimations(enter, exit, 0, 0); + } + + public FragmentTransaction setCustomAnimations(int enter, int exit, + int popEnter, int popExit) { mEnterAnim = enter; mExitAnim = exit; + mPopEnterAnim = popEnter; + mPopExitAnim = popExit; return this; } @@ -631,6 +653,7 @@ final class BackStackRecord extends FragmentTransaction implements switch (op.cmd) { case OP_ADD: { Fragment f = op.fragment; + f.mNextAnim = op.popExitAnim; f.mImmediateActivity = null; mManager.removeFragment(f, FragmentManagerImpl.reverseTransit(mTransition), @@ -638,6 +661,7 @@ final class BackStackRecord extends FragmentTransaction implements } break; case OP_REPLACE: { Fragment f = op.fragment; + f.mNextAnim = op.popExitAnim; f.mImmediateActivity = null; mManager.removeFragment(f, FragmentManagerImpl.reverseTransit(mTransition), @@ -645,6 +669,7 @@ final class BackStackRecord extends FragmentTransaction implements if (op.removed != null) { for (int i=0; i<op.removed.size(); i++) { Fragment old = op.removed.get(i); + old.mNextAnim = op.popEnterAnim; f.mImmediateActivity = mManager.mActivity; mManager.addFragment(old, false); } @@ -652,16 +677,19 @@ final class BackStackRecord extends FragmentTransaction implements } break; case OP_REMOVE: { Fragment f = op.fragment; + f.mNextAnim = op.popEnterAnim; f.mImmediateActivity = mManager.mActivity; mManager.addFragment(f, false); } break; case OP_HIDE: { Fragment f = op.fragment; + f.mNextAnim = op.popEnterAnim; mManager.showFragment(f, FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle); } break; case OP_SHOW: { Fragment f = op.fragment; + f.mNextAnim = op.popExitAnim; mManager.hideFragment(f, FragmentManagerImpl.reverseTransit(mTransition), mTransitionStyle); } break; diff --git a/core/java/android/app/FragmentTransaction.java b/core/java/android/app/FragmentTransaction.java index 15b873b20c66..c1f3cd61da1d 100644 --- a/core/java/android/app/FragmentTransaction.java +++ b/core/java/android/app/FragmentTransaction.java @@ -141,10 +141,20 @@ public abstract class FragmentTransaction { /** * Set specific animation resources to run for the fragments that are - * entering and exiting in this transaction. + * entering and exiting in this transaction. These animations will not be + * played when popping the back stack. */ public abstract FragmentTransaction setCustomAnimations(int enter, int exit); - + + /** + * Set specific animation resources to run for the fragments that are + * entering and exiting in this transaction. The <code>popEnter</code> + * and <code>popExit</code> animations will be played for enter/exit + * operations specifically when popping the back stack. + */ + public abstract FragmentTransaction setCustomAnimations(int enter, int exit, + int popEnter, int popExit); + /** * Select a standard transition animation for this transaction. May be * one of {@link #TRANSIT_NONE}, {@link #TRANSIT_FRAGMENT_OPEN}, |