@@ -382,6 +382,7 @@ final class FragmentManagerImpl extends FragmentManager {
382382 static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state" ;
383383 static final String TARGET_STATE_TAG = "android:target_state" ;
384384 static final String VIEW_STATE_TAG = "android:view_state" ;
385+ static final String USER_VISIBLE_HINT_TAG = "android:user_visible_hint" ;
385386
386387 ArrayList <Runnable > mPendingActions ;
387388 Runnable [] mTmpActions ;
@@ -406,6 +407,7 @@ final class FragmentManagerImpl extends FragmentManager {
406407 boolean mStateSaved ;
407408 boolean mDestroyed ;
408409 String mNoTransactionsBecause ;
410+ boolean mHavePendingDeferredStart ;
409411
410412 // Temporary vars for state save and restore.
411413 Bundle mStateBundle = null ;
@@ -711,6 +713,11 @@ Animator loadAnimator(Fragment fragment, int transit, boolean enter,
711713
712714 public void performPendingDeferredStart (Fragment f ) {
713715 if (f .mDeferStart ) {
716+ if (mExecutingActions ) {
717+ // Wait until we're done executing our pending transactions
718+ mHavePendingDeferredStart = true ;
719+ return ;
720+ }
714721 f .mDeferStart = false ;
715722 moveToState (f , mCurState , 0 , 0 );
716723 }
@@ -757,6 +764,14 @@ void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
757764 f .mTargetRequestCode = f .mSavedFragmentState .getInt (
758765 FragmentManagerImpl .TARGET_REQUEST_CODE_STATE_TAG , 0 );
759766 }
767+ f .mUserVisibleHint = f .mSavedFragmentState .getBoolean (
768+ FragmentManagerImpl .USER_VISIBLE_HINT_TAG , true );
769+ if (!f .mUserVisibleHint ) {
770+ f .mDeferStart = true ;
771+ if (newState > Fragment .STOPPED ) {
772+ newState = Fragment .STOPPED ;
773+ }
774+ }
760775 }
761776 f .mActivity = mActivity ;
762777 f .mFragmentManager = mActivity .mFragments ;
@@ -1343,7 +1358,7 @@ public boolean execPendingActions() {
13431358
13441359 synchronized (this ) {
13451360 if (mPendingActions == null || mPendingActions .size () == 0 ) {
1346- return didSomething ;
1361+ break ;
13471362 }
13481363
13491364 numActions = mPendingActions .size ();
@@ -1363,8 +1378,23 @@ public boolean execPendingActions() {
13631378 mExecutingActions = false ;
13641379 didSomething = true ;
13651380 }
1381+
1382+ if (mHavePendingDeferredStart ) {
1383+ boolean loadersRunning = false ;
1384+ for (int i =0 ; i <mActive .size (); i ++) {
1385+ Fragment f = mActive .get (i );
1386+ if (f != null && f .mLoaderManager != null ) {
1387+ loadersRunning |= f .mLoaderManager .hasRunningLoaders ();
1388+ }
1389+ }
1390+ if (!loadersRunning ) {
1391+ mHavePendingDeferredStart = false ;
1392+ startPendingDeferredFragments ();
1393+ }
1394+ }
1395+ return didSomething ;
13661396 }
1367-
1397+
13681398 void reportBackStackChanged () {
13691399 if (mBackStackChangeListeners != null ) {
13701400 for (int i =0 ; i <mBackStackChangeListeners .size (); i ++) {
@@ -1500,6 +1530,10 @@ Bundle saveFragmentBasicState(Fragment f) {
15001530 result .putSparseParcelableArray (
15011531 FragmentManagerImpl .VIEW_STATE_TAG , f .mSavedViewState );
15021532 }
1533+ if (!f .mUserVisibleHint ) {
1534+ // Only add this if it's not the default value
1535+ result .putBoolean (FragmentManagerImpl .USER_VISIBLE_HINT_TAG , f .mUserVisibleHint );
1536+ }
15031537
15041538 return result ;
15051539 }
0 commit comments