DialogFragment.java revision def1537e9e8d0dd190cde5310ddae8b921088c9b
1dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn/* 2dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 3dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * 4dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * you may not use this file except in compliance with the License. 6dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * You may obtain a copy of the License at 7dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * 8dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * 10dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * See the License for the specific language governing permissions and 14dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * limitations under the License. 15dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 16dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 17dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornpackage android.app; 18dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 19dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.content.DialogInterface; 20dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.os.Bundle; 21dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.LayoutInflater; 22dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.View; 23dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.ViewGroup; 24dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.Window; 25dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornimport android.view.WindowManager; 26dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 27dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn/** 28dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * A fragment that displays a dialog window, floating on top of its 29dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * activity's window. This fragment contains a Dialog object, which it 30dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * displays as appropriate based on the fragment's state. Control of 31dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * the dialog (deciding when to show, hide, dismiss it) should be done through 32dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * the API here, not with direct calls on the dialog. 33dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * 34dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * <p>Implementations should override this class and implement 35dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} to supply the 36dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * content of the dialog. Alternatively, they can override 37dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link #onCreateDialog(Bundle)} to create an entirely custom dialog, such 38dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * as an AlertDialog, with its own content. 39dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 40dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackbornpublic class DialogFragment extends Fragment 41dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { 42dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 43dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 4472dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru * Style for {@link #setStyle(int, int)}: a basic, 45dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * normal dialog. 46dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 47dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public static final int STYLE_NORMAL = 0; 48dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 49dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 5072dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru * Style for {@link #setStyle(int, int)}: don't include 51dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * a title area. 52dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 53dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public static final int STYLE_NO_TITLE = 1; 54dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 55dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 5672dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru * Style for {@link #setStyle(int, int)}: don't draw 57dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * any frame at all; the view hierarchy returned by {@link #onCreateView} 58dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * is entirely responsible for drawing the dialog. 59dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 60dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public static final int STYLE_NO_FRAME = 2; 61dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 62dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 6372dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru * Style for {@link #setStyle(int, int)}: like 64dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link #STYLE_NO_FRAME}, but also disables all input to the dialog. 65dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * The user can not touch it, and its window will not receive input focus. 66dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 67dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public static final int STYLE_NO_INPUT = 3; 68dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 69dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState"; 70dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn private static final String SAVED_STYLE = "android:style"; 71dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn private static final String SAVED_THEME = "android:theme"; 72dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn private static final String SAVED_CANCELABLE = "android:cancelable"; 73dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn private static final String SAVED_BACK_STACK_ID = "android:backStackId"; 74dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 75dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int mStyle = STYLE_NORMAL; 76dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int mTheme = 0; 77dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn boolean mCancelable = true; 78dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int mBackStackId = -1; 79dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 80dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn Dialog mDialog; 81dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn boolean mDestroyed; 82def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn boolean mRemoved; 83dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 84dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public DialogFragment() { 85dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 86dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 87dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 88b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Call to customize the basic appearance and behavior of the 89dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * fragment's dialog. This can be used for some common dialog behaviors, 90dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * taking care of selecting flags, theme, and other options for you. The 91dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * same effect can be achieve by manually setting Dialog and Window 92b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * attributes yourself. Calling this after the fragment's Dialog is 93b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * created will have no effect. 94dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * 95dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @param style Selects a standard style: may be {@link #STYLE_NORMAL}, 96dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or 97dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link #STYLE_NO_INPUT}. 98dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @param theme Optional custom theme. If 0, an appropriate theme (based 99dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * on the style) will be selected for you. 100dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 101b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void setStyle(int style, int theme) { 102dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mStyle = style; 103dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) { 104dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mTheme = android.R.style.Theme_Dialog_NoFrame; 105dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 106dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (theme != 0) { 107dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mTheme = theme; 108dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 109dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 110dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 111dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 112dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Display the dialog, adding the fragment to the given activity. This 113dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * is a convenience for explicitly creating a transaction, adding the 114dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * fragment to it with the given tag, and committing it. This does 115dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * <em>not</em> add the transaction to the back stack. When the fragment 116dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * is dismissed, a new transaction will be executed to remove it from 117dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * the activity. 118dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @param activity The activity this fragment will be added to. 119dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @param tag The tag for this fragment, as per 120dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}. 121dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 122dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void show(Activity activity, String tag) { 123dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn FragmentTransaction ft = activity.openFragmentTransaction(); 124dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ft.add(this, tag); 125dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ft.commit(); 126dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 127dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 128dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 129dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Display the dialog, adding the fragment to the given activity using 130dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * an existing transaction and then committing the transaction. 131dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @param activity The activity this fragment will be added to. 132dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @param transaction An existing transaction in which to add the fragment. 133dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @param tag The tag for this fragment, as per 134dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}. 135dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * @return Returns the identifier of the committed transaction, as per 136dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. 137dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 138dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public int show(Activity activity, FragmentTransaction transaction, String tag) { 139dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn transaction.add(this, tag); 140def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mRemoved = false; 141dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackId = transaction.commit(); 142dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return mBackStackId; 143dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 144dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 145dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 146dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * Dismiss the fragment and its dialog. If the fragment was added to the 147dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * back stack, all back stack state up to and including this entry will 148dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * be popped. Otherwise, a new transaction will be committed to remove 149dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn * the fragment. 150dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 151dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void dismiss() { 152dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mDialog != null) { 153dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.dismiss(); 154def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mDialog = null; 155dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 156def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mRemoved = true; 157dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackId >= 0) { 158def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn getFragmentManager().popBackStack(mBackStackId, 159def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManager.POP_BACK_STACK_INCLUSIVE); 160dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackId = -1; 161dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 162def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentTransaction ft = getFragmentManager().openTransaction(); 163dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ft.remove(this); 164dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ft.commit(); 165dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 166dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 167dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 168dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public Dialog getDialog() { 169dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return mDialog; 170dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 171dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 172dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public int getTheme() { 173dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return mTheme; 174dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 175dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 176dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void setCancelable(boolean cancelable) { 177dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mCancelable = cancelable; 178dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mDialog != null) mDialog.setCancelable(cancelable); 179dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 180dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 181dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public boolean getCancelable() { 182dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return mCancelable; 183dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 184dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 185dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn @Override 186dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onCreate(Bundle savedInstanceState) { 187dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn super.onCreate(savedInstanceState); 188dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (savedInstanceState != null) { 189dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mStyle = savedInstanceState.getInt(SAVED_STYLE, mStyle); 190dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mTheme = savedInstanceState.getInt(SAVED_THEME, mTheme); 191dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, mCancelable); 192dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, mBackStackId); 193dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 194dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 195dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 196dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 197dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return new Dialog(getActivity(), getTheme()); 198dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 199dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 200dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onCancel(DialogInterface dialog) { 201dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 202dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 203dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onDismiss(DialogInterface dialog) { 204def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (!mRemoved) { 205def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn dismiss(); 206def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 207dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 208dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 209dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn @Override 210dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onActivityCreated(Bundle savedInstanceState) { 211dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn super.onActivityCreated(savedInstanceState); 212dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog = onCreateDialog(savedInstanceState); 213dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDestroyed = false; 214dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn switch (mStyle) { 215dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn case STYLE_NO_INPUT: 216dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.getWindow().addFlags( 217dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 218dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 219dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn // fall through... 220dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn case STYLE_NO_FRAME: 221dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn case STYLE_NO_TITLE: 222dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 223dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 224dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn View view = getView(); 225dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (view != null) { 226dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (view.getParent() != null) { 227dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn throw new IllegalStateException("DialogFragment can not be attached to a container view"); 228dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 229dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.setContentView(view); 230dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 231dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.setOwnerActivity(getActivity()); 232dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.setCancelable(mCancelable); 233dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.setOnCancelListener(this); 234dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.setOnDismissListener(this); 235dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (savedInstanceState != null) { 236dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG); 237dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (dialogState != null) { 238dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDialog.onRestoreInstanceState(dialogState); 239dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 240dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 241dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 242dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 243dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn @Override 244dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onStart() { 245dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn super.onStart(); 246def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (mDialog != null) { 247def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mRemoved = false; 248def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mDialog.show(); 249def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 250dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 251dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 252dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn @Override 253dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onSaveInstanceState(Bundle outState) { 254dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn super.onSaveInstanceState(outState); 255dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mDialog != null) { 256dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn Bundle dialogState = mDialog.onSaveInstanceState(); 257dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (dialogState != null) { 258dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState); 259dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 260dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 261dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn outState.putInt(SAVED_STYLE, mStyle); 262dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn outState.putInt(SAVED_THEME, mTheme); 263dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn outState.putBoolean(SAVED_CANCELABLE, mCancelable); 264dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn outState.putInt(SAVED_BACK_STACK_ID, mBackStackId); 265dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 266dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 267dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn @Override 268dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onStop() { 269dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn super.onStop(); 270def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (mDialog != null) { 271def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mDialog.hide(); 272def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 273dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn /** 276def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn * Remove dialog. 277dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn */ 278dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn @Override 279dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void onDestroyView() { 280dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn super.onDestroyView(); 281dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mDestroyed = true; 282def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (mDialog != null) { 283def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn // Set removed here because this dismissal is just to hide 284def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn // the dialog -- we don't want this to cause the fragment to 285def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn // actually be removed. 286def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mRemoved = true; 287def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mDialog.dismiss(); 288def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn mDialog = null; 289def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 290dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 291dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn} 292