summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/FragmentManager.java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2010-05-05 18:49:48 -0700
committerDianne Hackborn <hackbod@google.com>2010-05-06 13:19:35 -0700
commitba51c3d02d08709e933de6f6c76dee3fd2f4bfa1 (patch)
treed8bd100a9199e3adcc2de13c88a96087f3c7c633 /core/java/android/app/FragmentManager.java
parent108817f3d85f80ddeb8db0ced75502520449a550 (diff)
downloadframeworks_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.java66
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;
}
}