diff --git a/api/current.txt b/api/current.txt index c00c3217241e8..b812f1b6119e6 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4592,6 +4592,7 @@ package android.app { public abstract class FragmentContainer { ctor public FragmentContainer(); + method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle); method public abstract android.view.View onFindViewById(int); method public abstract boolean onHasView(); } diff --git a/api/system-current.txt b/api/system-current.txt index 1ea191f6bdb9a..cbb7f86125b0d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4749,6 +4749,7 @@ package android.app { public abstract class FragmentContainer { ctor public FragmentContainer(); + method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle); method public abstract android.view.View onFindViewById(int); method public abstract boolean onHasView(); } diff --git a/api/test-current.txt b/api/test-current.txt index 7eed858e77885..8e2f781477815 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -4602,6 +4602,7 @@ package android.app { public abstract class FragmentContainer { ctor public FragmentContainer(); + method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle); method public abstract android.view.View onFindViewById(int); method public abstract boolean onHasView(); } diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 10ab2bc715904..62d68981d23c8 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -102,15 +102,19 @@ final class FragmentState implements Parcelable { mSavedFragmentState = in.readBundle(); } - public Fragment instantiate(FragmentHostCallback host, Fragment parent, - FragmentManagerNonConfig childNonConfig) { + public Fragment instantiate(FragmentHostCallback host, FragmentContainer container, + Fragment parent, FragmentManagerNonConfig childNonConfig) { if (mInstance == null) { final Context context = host.getContext(); if (mArguments != null) { mArguments.setClassLoader(context.getClassLoader()); } - mInstance = Fragment.instantiate(context, mClassName, mArguments); + if (container != null) { + mInstance = container.instantiate(context, mClassName, mArguments); + } else { + mInstance = Fragment.instantiate(context, mClassName, mArguments); + } if (mSavedFragmentState != null) { mSavedFragmentState.setClassLoader(context.getClassLoader()); diff --git a/core/java/android/app/FragmentContainer.java b/core/java/android/app/FragmentContainer.java index b2e0300b4016a..6ed54dcdbc855 100644 --- a/core/java/android/app/FragmentContainer.java +++ b/core/java/android/app/FragmentContainer.java @@ -18,6 +18,8 @@ package android.app; import android.annotation.IdRes; import android.annotation.Nullable; +import android.content.Context; +import android.os.Bundle; import android.view.View; /** @@ -35,4 +37,13 @@ public abstract class FragmentContainer { * Return {@code true} if the container holds any view. */ public abstract boolean onHasView(); + + /** + * Creates an instance of the specified fragment, can be overridden to construct fragments + * with dependencies, or change the fragment being constructed. By default just calls + * {@link Fragment#instantiate(Context, String, Bundle)}. + */ + public Fragment instantiate(Context context, String className, Bundle arguments) { + return Fragment.instantiate(context, className, arguments); + } } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 664fbf32912cf..44f1322f4b40c 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -2653,7 +2653,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (childNonConfigs != null && i < childNonConfigs.size()) { childNonConfig = childNonConfigs.get(i); } - Fragment f = fs.instantiate(mHost, mParent, childNonConfig); + Fragment f = fs.instantiate(mHost, mContainer, mParent, childNonConfig); if (DEBUG) Log.v(TAG, "restoreAllState: active #" + i + ": " + f); mActive.add(f); // Now that the fragment is instantiated (or came from being @@ -3272,7 +3272,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate + Integer.toHexString(id) + " fname=" + fname + " existing=" + fragment); if (fragment == null) { - fragment = Fragment.instantiate(context, fname); + fragment = mContainer.instantiate(context, fname, null); fragment.mFromLayout = true; fragment.mFragmentId = id != 0 ? id : containerId; fragment.mContainerId = containerId;