diff options
| author | Dianne Hackborn <hackbod@google.com> | 2011-01-24 23:58:13 -0800 |
|---|---|---|
| committer | Dianne Hackborn <hackbod@google.com> | 2011-01-25 11:28:39 -0800 |
| commit | 7187ccb93ee8adbb745fcbb901cfacfeed397a23 (patch) | |
| tree | cc1a17e2e05e8b4898a3ff9f2f5978275d272412 /core/java/android | |
| parent | 774f9be5dc02e8a7f742008872c6214e517cb8a3 (diff) | |
Fix issue #3385839: Fragment.onCreateView is passing in activity...
...context for a DialogFragment
Change-Id: I434ebca64d2738da4c27321db8dbbded2cbe167d
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/DialogFragment.java | 53 | ||||
| -rw-r--r-- | core/java/android/app/Fragment.java | 9 | ||||
| -rw-r--r-- | 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. + * + * <p>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 @@ -850,6 +850,15 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener } /** + * @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 * will be called immediately after the fragment is created from a <fragment> 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); |
