diff options
| author | Dianne Hackborn <hackbod@google.com> | 2010-05-05 18:49:48 -0700 |
|---|---|---|
| committer | Dianne Hackborn <hackbod@google.com> | 2010-05-06 13:19:35 -0700 |
| commit | ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1 (patch) | |
| tree | d8bd100a9199e3adcc2de13c88a96087f3c7c633 /core/java/android/app/FragmentManager.java | |
| parent | 108817f3d85f80ddeb8db0ced75502520449a550 (diff) | |
| download | frameworks_base-ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1.zip frameworks_base-ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1.tar.gz frameworks_base-ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1.tar.bz2 | |
New fragment stuff: back stack, and layout integration.
You can now have fragment transactions pushed on to a local back
stack, which will automatically be popped when the user pressed
back in the activity.
Fragments can also now be inserted into layouts.
Change-Id: Id1c9ae3fbc54f696cd8bb5ca5957bec4d3eabf18
Diffstat (limited to 'core/java/android/app/FragmentManager.java')
| -rw-r--r-- | core/java/android/app/FragmentManager.java | 66 |
1 files changed, 54 insertions, 12 deletions
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index d5e49cf..aa99a92 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -17,15 +17,21 @@ package android.app; import android.os.Bundle; +import android.os.Handler; import android.view.ViewGroup; import java.util.ArrayList; +interface BackStackState { + public void popFromBackStack(); +} + /** * Container for fragments associated with an activity. */ class FragmentManager { - final ArrayList<Fragment> mFragments = new ArrayList<Fragment>(); + ArrayList<Fragment> mFragments; + ArrayList<BackStackState> mBackStack; int mCurState = Fragment.INITIALIZING; Activity mActivity; @@ -130,20 +136,32 @@ class FragmentManager { f.mState = newState; } - void moveToState(int newState) { + void moveToState(int newState, boolean always) { if (mActivity == null && newState != Fragment.INITIALIZING) { throw new IllegalStateException("No activity"); } + if (!always && mCurState == newState) { + return; + } + mCurState = newState; - for (int i=0; i<mFragments.size(); i++) { - Fragment f = mFragments.get(i); - moveToState(f, newState); + if (mFragments != null) { + for (int i=0; i<mFragments.size(); i++) { + Fragment f = mFragments.get(i); + moveToState(f, newState); + } } } - public void addFragment(Fragment fragment) { + public void addFragment(Fragment fragment, boolean moveToStateNow) { + if (mFragments == null) { + mFragments = new ArrayList<Fragment>(); + } mFragments.add(fragment); + if (moveToStateNow) { + moveToState(fragment, mCurState); + } } public void removeFragment(Fragment fragment) { @@ -151,33 +169,57 @@ class FragmentManager { moveToState(fragment, Fragment.INITIALIZING); } + public void addBackStackState(BackStackState state) { + if (mBackStack == null) { + mBackStack = new ArrayList<BackStackState>(); + } + mBackStack.add(state); + } + + public boolean popBackStackState(Handler handler) { + if (mBackStack == null) { + return false; + } + int last = mBackStack.size()-1; + if (last < 0) { + return false; + } + final BackStackState bss = mBackStack.remove(last); + handler.post(new Runnable() { + public void run() { + bss.popFromBackStack(); + } + }); + return true; + } + public void attachActivity(Activity activity) { if (mActivity != null) throw new IllegalStateException(); mActivity = activity; } public void dispatchCreate(Bundle state) { - moveToState(Fragment.CREATED); + moveToState(Fragment.CREATED, false); } public void dispatchStart() { - moveToState(Fragment.STARTED); + moveToState(Fragment.STARTED, false); } public void dispatchResume() { - moveToState(Fragment.RESUMED); + moveToState(Fragment.RESUMED, false); } public void dispatchPause() { - moveToState(Fragment.STARTED); + moveToState(Fragment.STARTED, false); } public void dispatchStop() { - moveToState(Fragment.CREATED); + moveToState(Fragment.CREATED, false); } public void dispatchDestroy() { - moveToState(Fragment.INITIALIZING); + moveToState(Fragment.INITIALIZING, false); mActivity = null; } } |
