OSDN Git Service

Fix issue #3385839: Fragment.onCreateView is passing in activity...
authorDianne Hackborn <hackbod@google.com>
Tue, 25 Jan 2011 07:58:13 +0000 (23:58 -0800)
committerDianne Hackborn <hackbod@google.com>
Tue, 25 Jan 2011 19:28:39 +0000 (11:28 -0800)
...context for a DialogFragment

Change-Id: I434ebca64d2738da4c27321db8dbbded2cbe167d

core/java/android/app/DialogFragment.java
core/java/android/app/Fragment.java
core/java/android/app/FragmentManager.java

index 0bc89e7..8bdd086 100644 (file)
@@ -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) {
index b3d111a..8982110 100644 (file)
@@ -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>
index 2c9c85b..52b3108 100644 (file)
@@ -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);