diff --git a/api/current.txt b/api/current.txt index 8df50fe164023..e4169b2b7899a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4578,6 +4578,7 @@ package android.app { method public final android.app.FragmentManager getFragmentManager(); method public final java.lang.Object getHost(); method public final int getId(); + method public final android.view.LayoutInflater getLayoutInflater(); method public android.app.LoaderManager getLoaderManager(); method public final android.app.Fragment getParentFragment(); method public android.transition.Transition getReenterTransition(); diff --git a/api/system-current.txt b/api/system-current.txt index a240fa62624f2..5dd3b88f4ab7d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4745,6 +4745,7 @@ package android.app { method public final android.app.FragmentManager getFragmentManager(); method public final java.lang.Object getHost(); method public final int getId(); + method public final android.view.LayoutInflater getLayoutInflater(); method public android.app.LoaderManager getLoaderManager(); method public final android.app.Fragment getParentFragment(); method public android.transition.Transition getReenterTransition(); diff --git a/api/test-current.txt b/api/test-current.txt index bc5b8981f1567..47a0fd8f84998 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -4591,6 +4591,7 @@ package android.app { method public final android.app.FragmentManager getFragmentManager(); method public final java.lang.Object getHost(); method public final int getId(); + method public final android.view.LayoutInflater getLayoutInflater(); method public android.app.LoaderManager getLoaderManager(); method public final android.app.Fragment getParentFragment(); method public android.transition.Transition getReenterTransition(); diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index c7bcc54b51b6f..c5b93cd62b4c5 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -509,6 +509,10 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene // True if mHidden has been changed and the animation should be scheduled. boolean mHiddenChanged; + // The cached value from onGetLayoutInflater(Bundle) that will be returned from + // getLayoutInflater() + LayoutInflater mLayoutInflater; + /** * State information that has been retrieved from a fragment instance * through {@link FragmentManager#saveFragmentInstanceState(Fragment) @@ -1388,6 +1392,38 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene return result; } + /** + * Returns the cached LayoutInflater used to inflate Views of this Fragment. If + * {@link #onGetLayoutInflater(Bundle)} has not been called {@link #onGetLayoutInflater(Bundle)} + * will be called with a {@code null} argument and that value will be cached. + *

+ * The cached LayoutInflater will be replaced immediately prior to + * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} and cleared immediately after + * {@link #onDetach()}. + * + * @return The LayoutInflater used to inflate Views of this Fragment. + */ + public final LayoutInflater getLayoutInflater() { + if (mLayoutInflater == null) { + return performGetLayoutInflater(null); + } + return mLayoutInflater; + } + + /** + * Calls {@link #onGetLayoutInflater(Bundle)} and caches the result for use by + * {@link #getLayoutInflater()}. + * + * @param savedInstanceState If the fragment is being re-created from + * a previous saved state, this is the state. + * @return The LayoutInflater used to inflate Views of this Fragment. + */ + LayoutInflater performGetLayoutInflater(Bundle savedInstanceState) { + LayoutInflater layoutInflater = onGetLayoutInflater(savedInstanceState); + mLayoutInflater = layoutInflater; + return mLayoutInflater; + } + /** * @deprecated Use {@link #onInflate(Context, AttributeSet, Bundle)} instead. */ @@ -2835,6 +2871,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene void performDetach() { mCalled = false; onDetach(); + mLayoutInflater = null; if (!mCalled) { throw new SuperNotCalledException("Fragment " + this + " did not call through to super.onDetach()"); diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 91578a2da9c7c..2676f264415dc 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -1259,7 +1259,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } } f.mContainer = container; - f.mView = f.performCreateView(f.onGetLayoutInflater( + f.mView = f.performCreateView(f.performGetLayoutInflater( f.mSavedFragmentState), container, f.mSavedFragmentState); if (f.mView != null) { f.mView.setSaveFromParentEnabled(false); @@ -1431,7 +1431,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate void ensureInflatedFragmentView(Fragment f) { if (f.mFromLayout && !f.mPerformedCreateView) { - f.mView = f.performCreateView(f.onGetLayoutInflater( + f.mView = f.performCreateView(f.performGetLayoutInflater( f.mSavedFragmentState), null, f.mSavedFragmentState); if (f.mView != null) { f.mView.setSaveFromParentEnabled(false);