From 7187ccb93ee8adbb745fcbb901cfacfeed397a23 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 24 Jan 2011 23:58:13 -0800 Subject: Fix issue #3385839: Fragment.onCreateView is passing in activity... ...context for a DialogFragment Change-Id: I434ebca64d2738da4c27321db8dbbded2cbe167d --- core/java/android/app/DialogFragment.java | 53 +++++++++++++++++++++++------- core/java/android/app/Fragment.java | 9 +++++ core/java/android/app/FragmentManager.java | 4 +-- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/core/java/android/app/DialogFragment.java b/core/java/android/app/DialogFragment.java index 0bc89e722719..8bdd086eb466 100644 --- a/core/java/android/app/DialogFragment.java +++ b/core/java/android/app/DialogFragment.java @@ -16,6 +16,7 @@ package android.app; +import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; @@ -340,8 +341,48 @@ public class DialogFragment extends Fragment mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog); mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1); } + } + /** @hide */ + @Override + public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { + if (!mShowsDialog) { + return super.getLayoutInflater(savedInstanceState); + } + + mDialog = onCreateDialog(savedInstanceState); + mDestroyed = false; + switch (mStyle) { + case STYLE_NO_INPUT: + mDialog.getWindow().addFlags( + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); + // fall through... + case STYLE_NO_FRAME: + case STYLE_NO_TITLE: + mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + } + return (LayoutInflater)mDialog.getContext().getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + } + + /** + * Override to build your own custom Dialog container. This is typically + * used to show an AlertDialog instead of a generic Dialog; when doing so, + * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} does not need + * to be implemented since the AlertDialog takes care of its own content. + * + *

This method will be called after {@link #onCreate(Bundle)} and + * before {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. The + * default implementation simply instantiates and returns a {@link Dialog} + * class. + * + * @param savedInstanceState The last saved instance state of the Fragment, + * or null if this is a freshly created Fragment. + * + * @return Return a new Dialog instance to be displayed by the Fragment. + */ public Dialog onCreateDialog(Bundle savedInstanceState) { return new Dialog(getActivity(), getTheme()); } @@ -367,18 +408,6 @@ public class DialogFragment extends Fragment return; } - mDialog = onCreateDialog(savedInstanceState); - mDestroyed = false; - switch (mStyle) { - case STYLE_NO_INPUT: - mDialog.getWindow().addFlags( - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | - WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); - // fall through... - case STYLE_NO_FRAME: - case STYLE_NO_TITLE: - mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - } View view = getView(); if (view != null) { if (view.getParent() != null) { diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index b3d111aeb3e3..8982110ff0d5 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -849,6 +849,15 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener public void onActivityResult(int requestCode, int resultCode, Intent data) { } + /** + * @hide Hack so that DialogFragment can make its Dialog before creating + * its views, and the view construction can use the dialog's context for + * inflation. Maybe this should become a public API. Note sure. + */ + public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { + return mActivity.getLayoutInflater(); + } + /** * Called when a fragment is being created as part of a view layout * inflation, typically from setting the content view of an activity. This diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 2c9c85b11df9..52b310840276 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -705,7 +705,7 @@ final class FragmentManagerImpl extends FragmentManager { // For fragments that are part of the content view // layout, we need to instantiate the view immediately // and the inflater will take care of adding it. - f.mView = f.onCreateView(mActivity.getLayoutInflater(), + f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState); if (f.mView != null) { f.mView.setSaveFromParentEnabled(false); @@ -727,7 +727,7 @@ final class FragmentManagerImpl extends FragmentManager { } } f.mContainer = container; - f.mView = f.onCreateView(mActivity.getLayoutInflater(), + f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), container, f.mSavedFragmentState); if (f.mView != null) { f.mView.setSaveFromParentEnabled(false); -- cgit v1.2.3-59-g8ed1b