summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Powell <adamp@google.com> 2016-01-14 12:58:23 -0800
committer Adam Powell <adamp@google.com> 2016-01-21 10:38:52 -0800
commit592df7d8c61c350033ee35062b12c7d66b9a7c8c (patch)
treef3e9caa78f0111bb6a47da76746ee9a840ef5eb9
parent395371c1d79e2c010b1bf18b34a70b7609c0fdf4 (diff)
Init child fragments consistently with activity fragments
Fragments contained within an activity are restored from instance state in FragmentActivity.onCreate, but fragments contained within another fragment were previously restored from instance state in performCreate after onCreate returned. This meant that developers couldn't consistently rely on being able to control when this happens with a call to super.onCreate, and calls to findFragmentByTag to reconnect with a restored child fragment would fail in ways that succeed when the fragment is directly added to an activity. Change child fragment instance state restore to happen during Fragment.onCreate instead of in performCreate to be consistent with activity behavior. Preserve the old behavior for apps targeting an SDK version < N. Change-Id: I9c88d5554da9a32219d64c70ca638f75ecb233ed
-rw-r--r--core/java/android/app/Fragment.java38
1 files changed, 31 insertions, 7 deletions
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index e163b1c2ad23..20eaf0b8dca4 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -26,6 +26,7 @@ import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.os.Build;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -1416,11 +1417,30 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
* at this point. If you want to do work once the activity itself is
* created, see {@link #onActivityCreated(Bundle)}.
*
+ * <p>If your app's <code>targetSdkVersion</code> is 23 or lower, child fragments
+ * being restored from the savedInstanceState are restored after <code>onCreate</code>
+ * returns. When targeting N or above and running on an N or newer platform version
+ * they are restored by <code>Fragment.onCreate</code>.</p>
+ *
* @param savedInstanceState If the fragment is being re-created from
* a previous saved state, this is the state.
*/
public void onCreate(@Nullable Bundle savedInstanceState) {
mCalled = true;
+ final Context context = getContext();
+ final int version = context != null ? context.getApplicationInfo().targetSdkVersion : 0;
+ if (version >= Build.VERSION_CODES.N) {
+ if (savedInstanceState != null) {
+ Parcelable p = savedInstanceState.getParcelable(Activity.FRAGMENTS_TAG);
+ if (p != null) {
+ if (mChildFragmentManager == null) {
+ instantiateChildFragmentManager();
+ }
+ mChildFragmentManager.restoreAllState(p, null);
+ mChildFragmentManager.dispatchCreate();
+ }
+ }
+ }
}
/**
@@ -2210,14 +2230,18 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
throw new SuperNotCalledException("Fragment " + this
+ " did not call through to super.onCreate()");
}
- if (savedInstanceState != null) {
- Parcelable p = savedInstanceState.getParcelable(Activity.FRAGMENTS_TAG);
- if (p != null) {
- if (mChildFragmentManager == null) {
- instantiateChildFragmentManager();
+ final Context context = getContext();
+ final int version = context != null ? context.getApplicationInfo().targetSdkVersion : 0;
+ if (version < Build.VERSION_CODES.N) {
+ if (savedInstanceState != null) {
+ Parcelable p = savedInstanceState.getParcelable(Activity.FRAGMENTS_TAG);
+ if (p != null) {
+ if (mChildFragmentManager == null) {
+ instantiateChildFragmentManager();
+ }
+ mChildFragmentManager.restoreAllState(p, null);
+ mChildFragmentManager.dispatchCreate();
}
- mChildFragmentManager.restoreAllState(p, null);
- mChildFragmentManager.dispatchCreate();
}
}
}