12dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/*
22dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
32dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
42dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
52dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * you may not use this file except in compliance with the License.
62dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * You may obtain a copy of the License at
72dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
82dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
92dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Unless required by applicable law or agreed to in writing, software
112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * See the License for the specific language governing permissions and
142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * limitations under the License.
152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornpackage android.app;
182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
19a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haaseimport android.animation.Animator;
20c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.content.ComponentCallbacks2;
21b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.Context;
226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackbornimport android.content.Intent;
232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.content.res.Configuration;
24bdd19bc338286e1042f59808545665a061e73ffcDianne Hackbornimport android.content.res.Resources;
252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle;
26b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel;
27b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable;
28b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackbornimport android.util.AndroidRuntimeException;
29ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.util.AttributeSet;
30a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackbornimport android.util.DebugUtils;
3103fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackbornimport android.util.Log;
32b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray;
335ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackbornimport android.view.ContextMenu;
34f0f5fffc6f578f531df7b208cfbfb53f884c0380Adam Powellimport android.view.ContextMenu.ContextMenuInfo;
352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.LayoutInflater;
36b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu;
37b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater;
38b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem;
392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.View;
405ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackbornimport android.view.View.OnCreateContextMenuListener;
41f0f5fffc6f578f531df7b208cfbfb53f884c0380Adam Powellimport android.view.ViewGroup;
425ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackbornimport android.widget.AdapterView;
432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
44625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.FileDescriptor;
45625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.PrintWriter;
46b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport java.util.HashMap;
47b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
48b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentState implements Parcelable {
49b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final String mClassName;
506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    final int mIndex;
51b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final boolean mFromLayout;
52b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int mFragmentId;
53b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int mContainerId;
54b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final String mTag;
55b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final boolean mRetainInstance;
5616f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    final boolean mDetached;
57b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    final Bundle mArguments;
58b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
59b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Bundle mSavedFragmentState;
60b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
61b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Fragment mInstance;
62b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
63b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentState(Fragment frag) {
64b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mClassName = frag.getClass().getName();
656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mIndex = frag.mIndex;
66b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFromLayout = frag.mFromLayout;
67b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFragmentId = frag.mFragmentId;
68b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mContainerId = frag.mContainerId;
69b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTag = frag.mTag;
70b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRetainInstance = frag.mRetainInstance;
7116f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn        mDetached = frag.mDetached;
72b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        mArguments = frag.mArguments;
73b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
74b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
75b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentState(Parcel in) {
76b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mClassName = in.readString();
776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mIndex = in.readInt();
78b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFromLayout = in.readInt() != 0;
79b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFragmentId = in.readInt();
80b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mContainerId = in.readInt();
81b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTag = in.readString();
82b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRetainInstance = in.readInt() != 0;
8316f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn        mDetached = in.readInt() != 0;
84b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        mArguments = in.readBundle();
85b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mSavedFragmentState = in.readBundle();
86b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
87b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
8862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    public Fragment instantiate(Activity activity, Fragment parent) {
89b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mInstance != null) {
90b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return mInstance;
91b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
92b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
935164246d7e47b9c995ca1e1587f3056eb777f60bDianne Hackborn        if (mArguments != null) {
945164246d7e47b9c995ca1e1587f3056eb777f60bDianne Hackborn            mArguments.setClassLoader(activity.getClassLoader());
955164246d7e47b9c995ca1e1587f3056eb777f60bDianne Hackborn        }
965164246d7e47b9c995ca1e1587f3056eb777f60bDianne Hackborn
97b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        mInstance = Fragment.instantiate(activity, mClassName, mArguments);
98b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
99b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mSavedFragmentState != null) {
100b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mSavedFragmentState.setClassLoader(activity.getClassLoader());
101b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mInstance.mSavedFragmentState = mSavedFragmentState;
102b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
10362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mInstance.setIndex(mIndex, parent);
1046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mInstance.mFromLayout = mFromLayout;
105352cc98b4621b76959af8f8a698fd75c6d6132e8Dianne Hackborn        mInstance.mRestored = true;
106b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mInstance.mFragmentId = mFragmentId;
107b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mInstance.mContainerId = mContainerId;
108b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mInstance.mTag = mTag;
109b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mInstance.mRetainInstance = mRetainInstance;
11016f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn        mInstance.mDetached = mDetached;
1113e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        mInstance.mFragmentManager = activity.mFragments;
11203fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn        if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
11303fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn                "Instantiated fragment " + mInstance);
11403fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn
115b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mInstance;
116b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
117b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
118b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int describeContents() {
119b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return 0;
120b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
121b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
122b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
123b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeString(mClassName);
1246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        dest.writeInt(mIndex);
125b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mFromLayout ? 1 : 0);
126b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mFragmentId);
127b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mContainerId);
128b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeString(mTag);
129b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mRetainInstance ? 1 : 0);
13016f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn        dest.writeInt(mDetached ? 1 : 0);
131b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        dest.writeBundle(mArguments);
132b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeBundle(mSavedFragmentState);
133b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
134b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
135b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public static final Parcelable.Creator<FragmentState> CREATOR
136b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            = new Parcelable.Creator<FragmentState>() {
137b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentState createFromParcel(Parcel in) {
138b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentState(in);
139b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentState[] newArray(int size) {
142b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentState[size];
143b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
144b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    };
145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn}
146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/**
1482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * A Fragment is a piece of an application's user interface or behavior
149291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * that can be placed in an {@link Activity}.  Interaction with fragments
150291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * is done through {@link FragmentManager}, which can be obtained via
151291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@link Activity#getFragmentManager() Activity.getFragmentManager()} and
152291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@link Fragment#getFragmentManager() Fragment.getFragmentManager()}.
153291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
154291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>The Fragment class can be used many ways to achieve a wide variety of
1551b4e4b657cd730046b51d3cabdf1525d89637a4cfelipeal * results. In its core, it represents a particular operation or interface
156291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * that is running within a larger {@link Activity}.  A Fragment is closely
157291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * tied to the Activity it is in, and can not be used apart from one.  Though
158291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * Fragment defines its own lifecycle, that lifecycle is dependent on its
159291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * activity: if the activity is stopped, no fragments inside of it can be
160291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * started; when the activity is destroyed, all fragments will be destroyed.
161291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
162291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>All subclasses of Fragment must include a public empty constructor.
163291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * The framework will often re-instantiate a fragment class when needed,
164291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * in particular during state restore, and needs to be able to find this
165291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * constructor to instantiate it.  If the empty constructor is not available,
166291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * a runtime exception will occur in some cases during state restore.
167291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
168291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>Topics covered here:
169291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <ol>
170f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn * <li><a href="#OlderPlatforms">Older Platforms</a>
171291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li><a href="#Lifecycle">Lifecycle</a>
172291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li><a href="#Layout">Layout</a>
173291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li><a href="#BackStack">Back Stack</a>
174291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * </ol>
175291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
176b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <div class="special reference">
177b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <h3>Developer Guides</h3>
178b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <p>For more information about using fragments, read the
179b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</p>
180b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * </div>
181b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez *
182f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn * <a name="OlderPlatforms"></a>
183f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn * <h3>Older Platforms</h3>
184f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn *
185f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn * While the Fragment API was introduced in
186f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, a version of the API
1877871badd5d4d29d80207e9cc09a0681f26a151d0Dianne Hackborn * at is also available for use on older platforms through
1887871badd5d4d29d80207e9cc09a0681f26a151d0Dianne Hackborn * {@link android.support.v4.app.FragmentActivity}.  See the blog post
189f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn * <a href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html">
190f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn * Fragments For All</a> for more details.
191f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8fDianne Hackborn *
192291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <a name="Lifecycle"></a>
193291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <h3>Lifecycle</h3>
194291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
195291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>Though a Fragment's lifecycle is tied to its owning activity, it has
196291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * its own wrinkle on the standard activity lifecycle.  It includes basic
197291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * activity lifecycle methods such as {@link #onResume}, but also important
198291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * are methods related to interactions with the activity and UI generation.
199291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
200291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>The core series of lifecycle methods that are called to bring a fragment
201291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * up to resumed state (interacting with the user) are:
202291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
203291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <ol>
204291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onAttach} called once the fragment is associated with its activity.
205291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onCreate} called to do initial creation of the fragment.
206291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onCreateView} creates and returns the view hierarchy associated
207291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * with the fragment.
208291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onActivityCreated} tells the fragment that its activity has
2093790001c20494d1f355a67bec7751c4b8f07874fQuddus Chong * completed its own {@link Activity#onCreate Activity.onCreate()}.
21062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn * <li> {@link #onViewStateRestored} tells the fragment that all of the saved
21162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn * state of its view hierarchy has been restored.
212291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onStart} makes the fragment visible to the user (based on its
213291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * containing activity being started).
214291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onResume} makes the fragment interacting with the user (based on its
215291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * containing activity being resumed).
216291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * </ol>
217291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
218291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>As a fragment is no longer being used, it goes through a reverse
219291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * series of callbacks:
220291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
221291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <ol>
222291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onPause} fragment is no longer interacting with the user either
223291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * because its activity is being paused or a fragment operation is modifying it
224291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * in the activity.
225291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onStop} fragment is no longer visible to the user either
226291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * because its activity is being stopped or a fragment operation is modifying it
227291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * in the activity.
228291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onDestroyView} allows the fragment to clean up resources
229291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * associated with its View.
230291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onDestroy} called to do final cleanup of the fragment's state.
231291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <li> {@link #onDetach} called immediately prior to the fragment no longer
232291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * being associated with its activity.
233291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * </ol>
234291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
235291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <a name="Layout"></a>
236291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <h3>Layout</h3>
237291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
238291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>Fragments can be used as part of your application's layout, allowing
239291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * you to better modularize your code and more easily adjust your user
240291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * interface to the screen it is running on.  As an example, we can look
241291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * at a simple program consisting of a list of items, and display of the
242291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * details of each item.</p>
243291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
244291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>An activity's layout XML can include <code>&lt;fragment&gt;</code> tags
245291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * to embed fragment instances inside of the layout.  For example, here is
246625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * a simple layout that embeds one fragment:</p>
247291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
248291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/res/layout/fragment_layout.xml layout}
249291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
250291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>The layout is installed in the activity in the normal way:</p>
251291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
252291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java
253291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *      main}
254291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
25587121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * <p>The titles fragment, showing a list of titles, is fairly simple, relying
256291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * on {@link ListFragment} for most of its work.  Note the implementation of
25787121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * clicking an item: depending on the current activity's layout, it can either
25887121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * create and display a new fragment to show the details in-place (more about
259542f2409d9be9211dcb8cdfe2f863c22ff6cf26fBen Dodson * this later), or start a new activity to show the details.</p>
260291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
261291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java
262291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *      titles}
263291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
264542f2409d9be9211dcb8cdfe2f863c22ff6cf26fBen Dodson * <p>The details fragment showing the contents of a selected item just
265291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * displays a string of text based on an index of a string array built in to
266291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * the app:</p>
267291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
268291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java
269291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *      details}
270291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
271291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>In this case when the user clicks on a title, there is no details
272542f2409d9be9211dcb8cdfe2f863c22ff6cf26fBen Dodson * container in the current activity, so the titles fragment's click code will
273291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * launch a new activity to display the details fragment:</p>
274291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
275291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java
276291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *      details_activity}
277291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
278291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>However the screen may be large enough to show both the list of titles
279291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * and details about the currently selected title.  To use such a layout on
280291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * a landscape screen, this alternative layout can be placed under layout-land:</p>
281291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
282291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/res/layout-land/fragment_layout.xml layout}
283291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
28487121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * <p>Note how the prior code will adjust to this alternative UI flow: the titles
28587121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * fragment will now embed the details fragment inside of this activity, and the
28687121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * details activity will finish itself if it is running in a configuration
28787121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * where the details can be shown in-place.
288291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
289625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * <p>When a configuration change causes the activity hosting these fragments
290625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * to restart, its new instance may use a different layout that doesn't
291625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * include the same fragments as the previous layout.  In this case all of
292625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * the previous fragments will still be instantiated and running in the new
29387121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * instance.  However, any that are no longer associated with a &lt;fragment&gt;
29487121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * tag in the view hierarchy will not have their content view created
29587121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * and will return false from {@link #isInLayout}.  (The code here also shows
29687121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * how you can determine if a fragment placed in a container is no longer
29787121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * running in a layout with that container and avoid creating its view hierarchy
29887121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * in that case.)
299625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn *
300625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * <p>The attributes of the &lt;fragment&gt; tag are used to control the
30187121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * LayoutParams provided when attaching the fragment's view to the parent
30287121accdb0ce318482ac51270763a6faab2ed63Dianne Hackborn * container.  They can also be parsed by the fragment in {@link #onInflate}
303625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * as parameters.
304625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn *
305625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * <p>The fragment being instantiated must have some kind of unique identifier
306625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * so that it can be re-associated with a previous instance if the parent
307625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * activity needs to be destroyed and recreated.  This can be provided these
308625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * ways:
309625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn *
310625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * <ul>
311625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * <li>If nothing is explicitly supplied, the view ID of the container will
312625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * be used.
313625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * <li><code>android:tag</code> can be used in &lt;fragment&gt; to provide
314625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * a specific tag name for the fragment.
315625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * <li><code>android:id</code> can be used in &lt;fragment&gt; to provide
316625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * a specific identifier for the fragment.
317625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * </ul>
318625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn *
319291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <a name="BackStack"></a>
320291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <h3>Back Stack</h3>
321291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
322291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>The transaction in which fragments are modified can be placed on an
323291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * internal back-stack of the owning activity.  When the user presses back
324291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * in the activity, any transactions on the back stack are popped off before
325291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * the activity itself is finished.
326291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
327291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>For example, consider this simple fragment that is instantiated with
328291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * an integer argument and displays that in a TextView in its UI:</p>
329291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
330291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentStack.java
331291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *      fragment}
332291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
333291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>A function that creates a new instance of the fragment, replacing
334291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * whatever current fragment instance is being shown and pushing that change
335291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * on to the back stack could be written as:
336291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
337291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentStack.java
338291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *      add_stack}
339291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn *
340291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * <p>After each call to this function, a new entry is on the stack, and
341291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * pressing back will pop it to return the user to whatever previous state
342291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * the activity UI was in.
3432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
344c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornpublic class Fragment implements ComponentCallbacks2, OnCreateContextMenuListener {
345c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    private static final HashMap<String, Class<?>> sClassMap =
346c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            new HashMap<String, Class<?>>();
347b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
348635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    static final int INVALID_STATE = -1;   // Invalid state used as a null value.
349c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    static final int INITIALIZING = 0;     // Not yet created.
350c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    static final int CREATED = 1;          // Created.
351c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    static final int ACTIVITY_CREATED = 2; // The activity has finished its creation.
35216f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    static final int STOPPED = 3;          // Fully created, not started.
35316f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    static final int STARTED = 4;          // Created and started, not resumed.
35416f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    static final int RESUMED = 5;          // Created started and resumed.
3552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
3562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    int mState = INITIALIZING;
357b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
358d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn    // Non-null if the fragment's view hierarchy is currently animating away,
359d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn    // meaning we need to wait a bit on completely destroying it.  This is the
360d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn    // animation that is running.
361d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn    Animator mAnimatingAway;
362d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn
363d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn    // If mAnimatingAway != null, this is the state we should move to once the
364d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn    // animation is done.
365d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn    int mStateAfterAnimating;
366d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn
367b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // When instantiated from saved state, this is the saved state.
368b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Bundle mSavedFragmentState;
369b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    SparseArray<Parcelable> mSavedViewState;
370b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
3716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    // Index into active fragment array.
3726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    int mIndex = -1;
3736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
3746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    // Internal unique name for this fragment;
3756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    String mWho;
3766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
377b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    // Construction arguments;
378b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    Bundle mArguments;
379b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
380def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    // Target fragment.
381def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    Fragment mTarget;
382def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
383f930232fd1c8d301d91853c8fe5dca43979ac807Dianne Hackborn    // For use when retaining a fragment: this is the index of the last mTarget.
384f930232fd1c8d301d91853c8fe5dca43979ac807Dianne Hackborn    int mTargetIndex = -1;
385f930232fd1c8d301d91853c8fe5dca43979ac807Dianne Hackborn
386def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    // Target request code.
387def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    int mTargetRequestCode;
388def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
3896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    // True if the fragment is in the list of added fragments.
3906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    boolean mAdded;
3916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
3925d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn    // If set this fragment is being removed from its activity.
3935d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn    boolean mRemoving;
3945d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn
3952707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn    // True if the fragment is in the resumed state.
3962707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn    boolean mResumed;
3972707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn
398b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Set to true if this fragment was instantiated from a layout file.
399b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mFromLayout;
400b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
401625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    // Set to true when the view has actually been inflated in its layout.
402625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    boolean mInLayout;
403625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
404352cc98b4621b76959af8f8a698fd75c6d6132e8Dianne Hackborn    // True if this fragment has been restored from previously saved state.
405352cc98b4621b76959af8f8a698fd75c6d6132e8Dianne Hackborn    boolean mRestored;
406352cc98b4621b76959af8f8a698fd75c6d6132e8Dianne Hackborn
407b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Number of active back stack entries this fragment is in.
408f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    int mBackStackNesting;
409b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
4103e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn    // The fragment manager we are associated with.  Set as soon as the
4113e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn    // fragment is used in a transaction; cleared after it has been removed
4123e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn    // from all transactions.
413635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    FragmentManagerImpl mFragmentManager;
4143e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn
415b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Activity this fragment is attached to.
4162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    Activity mActivity;
41762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
41862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    // Private fragment manager for child fragments inside of this one.
41962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    FragmentManagerImpl mChildFragmentManager;
42062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
42162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    // If this Fragment is contained in another Fragment, this is that container.
42262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    Fragment mParentFragment;
42362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
424b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // The optional identifier for this fragment -- either the container ID if it
425b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // was dynamically added to the view hierarchy, or the ID supplied in
426b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // layout.
427b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int mFragmentId;
428b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
429b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // When a fragment is being dynamically added to the view hierarchy, this
430b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // is the identifier of the parent container it is being added to.
4312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    int mContainerId;
4322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
433b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // The optional named tag for this fragment -- usually used to find
434b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // fragments that are not part of the layout.
435b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    String mTag;
436b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
4375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    // Set to true when the app has requested that this fragment be hidden
4385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    // from the user.
4395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    boolean mHidden;
4405ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
44116f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    // Set to true when the app has requested that this fragment be detached.
44216f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    boolean mDetached;
44316f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn
444b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // If set this fragment would like its instance retained across
445b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // configuration changes.
446b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mRetainInstance;
447b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
448b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // If set this fragment is being retained across the current config change.
449b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mRetaining;
450b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
451b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    // If set this fragment has menu items to contribute.
452b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    boolean mHasMenu;
4536c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn
4546c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn    // Set to true to allow the fragment's menu to be shown.
4556c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn    boolean mMenuVisible = true;
4566c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn
457b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Used to verify that subclasses call through to super class.
458b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mCalled;
459b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
4605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    // If app has requested a specific animation, this is the one to use.
4615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    int mNextAnim;
4625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
463b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // The parent container of the fragment after dynamically added to UI.
4642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    ViewGroup mContainer;
465b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
466b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // The View generated for this fragment.
4672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    View mView;
4682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
469635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    // Whether this fragment should defer starting until after other fragments
470635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    // have been started and their loaders are finished.
471635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    boolean mDeferStart;
472635c60af623c73d2409f5729c0953638b5d6c497Adam Powell
47378fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell    // Hint provided by the app that this fragment is currently visible to the user.
47478fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell    boolean mUserVisibleHint = true;
47578fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell
4764911b783aa9f4af5ac919db861751d350471f5efDianne Hackborn    LoaderManagerImpl mLoaderManager;
477fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    boolean mLoadersStarted;
4785e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn    boolean mCheckedForLoaderManager;
479c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
480c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
481b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * State information that has been retrieved from a fragment instance
482b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * through {@link FragmentManager#saveFragmentInstanceState(Fragment)
483b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * FragmentManager.saveFragmentInstanceState}.
484b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     */
485b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn    public static class SavedState implements Parcelable {
486b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        final Bundle mState;
487b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
488b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        SavedState(Bundle state) {
489b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            mState = state;
490b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        }
491b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
492b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        SavedState(Parcel in, ClassLoader loader) {
493b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            mState = in.readBundle();
494b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            if (loader != null && mState != null) {
495b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn                mState.setClassLoader(loader);
496b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            }
497b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        }
498b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
499b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        @Override
500b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        public int describeContents() {
501b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            return 0;
502b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        }
503b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
504b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        @Override
505b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
506b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            dest.writeBundle(mState);
507b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        }
508b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
509b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        public static final Parcelable.ClassLoaderCreator<SavedState> CREATOR
510b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn                = new Parcelable.ClassLoaderCreator<SavedState>() {
511b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            public SavedState createFromParcel(Parcel in) {
512b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn                return new SavedState(in, null);
513b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            }
514b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
515b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            public SavedState createFromParcel(Parcel in, ClassLoader loader) {
516b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn                return new SavedState(in, loader);
517b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            }
518b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
519b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            public SavedState[] newArray(int size) {
520b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn                return new SavedState[size];
521b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            }
522b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        };
523b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn    }
524b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
525b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn    /**
526b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Thrown by {@link Fragment#instantiate(Context, String, Bundle)} when
527b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * there is an instantiation failure.
528b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
529b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    static public class InstantiationException extends AndroidRuntimeException {
530b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        public InstantiationException(String msg, Exception cause) {
531b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            super(msg, cause);
532b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
533b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
534b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
535b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
536291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * Default constructor.  <strong>Every</strong> fragment must have an
537c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * empty constructor, so it can be instantiated when restoring its
538c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * activity's state.  It is strongly recommended that subclasses do not
539c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * have other constructors with parameters, since these constructors
540c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * will not be called when the fragment is re-instantiated; instead,
541b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * arguments can be supplied by the caller with {@link #setArguments}
542b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * and later retrieved by the Fragment with {@link #getArguments}.
543b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     *
544291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * <p>Applications should generally not implement a constructor.  The
545291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * first place application code an run where the fragment is ready to
546291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * be used is in {@link #onAttach(Activity)}, the point where the fragment
547291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * is actually associated with its activity.  Some applications may also
548291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * want to implement {@link #onInflate} to retrieve attributes from a
549291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * layout resource, though should take care here because this happens for
550291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * the fragment is attached to its activity.
551c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
5522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public Fragment() {
5532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
554b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
555b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
556b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Like {@link #instantiate(Context, String, Bundle)} but with a null
557b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * argument Bundle.
558b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
559b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public static Fragment instantiate(Context context, String fname) {
560b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return instantiate(context, fname, null);
561b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
562b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
563b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
564b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * Create a new instance of a Fragment with the given class name.  This is
565b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * the same as calling its empty constructor.
566b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
567b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param context The calling context being used to instantiate the fragment.
568b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * This is currently just used to get its ClassLoader.
569b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param fname The class name of the fragment to instantiate.
570b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param args Bundle of arguments to supply to the fragment, which it
571b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * can retrieve with {@link #getArguments()}.  May be null.
572b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @return Returns a new fragment instance.
573b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @throws InstantiationException If there is a failure in instantiating
574b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * the given fragment class.  This is a runtime exception; it is not
575b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * normally expected to happen.
576b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
577b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public static Fragment instantiate(Context context, String fname, Bundle args) {
578b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        try {
579b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            Class<?> clazz = sClassMap.get(fname);
580b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            if (clazz == null) {
581b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                // Class not found in the cache, see if it's real, and try to add it
582b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                clazz = context.getClassLoader().loadClass(fname);
583b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                sClassMap.put(fname, clazz);
584b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            }
585b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            Fragment f = (Fragment)clazz.newInstance();
586b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            if (args != null) {
587b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                args.setClassLoader(f.getClass().getClassLoader());
588b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                f.mArguments = args;
589b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            }
590b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            return f;
591b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        } catch (ClassNotFoundException e) {
592b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new InstantiationException("Unable to instantiate fragment " + fname
593b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + ": make sure class name exists, is public, and has an"
594b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + " empty constructor that is public", e);
595b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        } catch (java.lang.InstantiationException e) {
596b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new InstantiationException("Unable to instantiate fragment " + fname
597b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + ": make sure class name exists, is public, and has an"
598b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + " empty constructor that is public", e);
599b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        } catch (IllegalAccessException e) {
600b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new InstantiationException("Unable to instantiate fragment " + fname
601b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + ": make sure class name exists, is public, and has an"
602b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + " empty constructor that is public", e);
603b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
604b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
605b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
60662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    final void restoreViewState(Bundle savedInstanceState) {
607b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mSavedViewState != null) {
608b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mView.restoreHierarchyState(mSavedViewState);
609b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mSavedViewState = null;
610b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
61162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
61262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onViewStateRestored(savedInstanceState);
61362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
61462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
61562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onViewStateRestored()");
61662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
617b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
6181b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn
61962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    final void setIndex(int index, Fragment parent) {
6206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mIndex = index;
62162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (parent != null) {
62262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mWho = parent.mWho + ":" + mIndex;
62362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        } else {
62462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mWho = "android:fragment:" + mIndex;
62562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
6261b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    }
6271b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn
62816f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    final boolean isInBackStack() {
62916f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn        return mBackStackNesting > 0;
63016f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    }
63116f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn
632b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
633b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Subclasses can not override equals().
634b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
635b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    @Override final public boolean equals(Object o) {
636b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return super.equals(o);
637b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
638b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
639b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
640b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Subclasses can not override hashCode().
641b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
642b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    @Override final public int hashCode() {
643b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return super.hashCode();
644b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
6452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
6465ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    @Override
6475ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    public String toString() {
6485ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        StringBuilder sb = new StringBuilder(128);
649a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        DebugUtils.buildShortClassTag(this, sb);
6505ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (mIndex >= 0) {
6515ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            sb.append(" #");
6525ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            sb.append(mIndex);
6535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
6545ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (mFragmentId != 0) {
6555ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            sb.append(" id=0x");
6565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            sb.append(Integer.toHexString(mFragmentId));
6575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
6585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (mTag != null) {
6595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            sb.append(" ");
6605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            sb.append(mTag);
6615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
6625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        sb.append('}');
6635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        return sb.toString();
6645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
6655ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
666b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
667b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Return the identifier this fragment is known by.  This is either
668b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * the android:id value supplied in a layout or the container view ID
669b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * supplied when adding the fragment.
670b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
671b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    final public int getId() {
672b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mFragmentId;
673b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
674b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
675b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
676b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Get the tag name of the fragment, if specified.
677b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
678b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    final public String getTag() {
679b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mTag;
680b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
681b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
682b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
683b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Supply the construction arguments for this fragment.  This can only
684b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * be called before the fragment has been attached to its activity; that
685b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * is, you should call it immediately after constructing the fragment.  The
686b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * arguments supplied here will be retained across fragment destroy and
687b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * creation.
688b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
689def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    public void setArguments(Bundle args) {
690b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (mIndex >= 0) {
691b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalStateException("Fragment already active");
692b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
693b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        mArguments = args;
694b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
695b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
696b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
697b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Return the arguments supplied when the fragment was instantiated,
698b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * if any.
699b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
700b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    final public Bundle getArguments() {
701b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mArguments;
702b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
703b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
704b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
705b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * Set the initial saved state that this Fragment should restore itself
706b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * from when first being constructed, as returned by
707b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * {@link FragmentManager#saveFragmentInstanceState(Fragment)
708b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * FragmentManager.saveFragmentInstanceState}.
709b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     *
710b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     * @param state The state the fragment should be restored from.
711b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn     */
712b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn    public void setInitialSavedState(SavedState state) {
713b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        if (mIndex >= 0) {
714b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn            throw new IllegalStateException("Fragment already active");
715b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        }
716b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn        mSavedFragmentState = state != null && state.mState != null
717b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn                ? state.mState : null;
718b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn    }
719b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn
720b46ed7636be9341b6ce0b158b3d86f34a437e6daDianne Hackborn    /**
721def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * Optional target for this fragment.  This may be used, for example,
722def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * if this fragment is being started by another, and when done wants to
723def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * give a result back to the first.  The target set here is retained
724def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * across instances via {@link FragmentManager#putFragment
725def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * FragmentManager.putFragment()}.
726def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     *
727def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @param fragment The fragment that is the target of this one.
728def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * @param requestCode Optional request code, for convenience if you
729def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * are going to call back with {@link #onActivityResult(int, int, Intent)}.
730def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     */
731def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    public void setTargetFragment(Fragment fragment, int requestCode) {
732def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        mTarget = fragment;
733def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        mTargetRequestCode = requestCode;
734def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    }
735def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
736def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    /**
7373f00be5bd0b46e7937b68909baeff295b86215ccDianne Hackborn     * Return the target fragment set by {@link #setTargetFragment}.
738def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     */
739def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    final public Fragment getTargetFragment() {
740def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        return mTarget;
741def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    }
742def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
743def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    /**
7443f00be5bd0b46e7937b68909baeff295b86215ccDianne Hackborn     * Return the target request code set by {@link #setTargetFragment}.
745def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     */
746def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    final public int getTargetRequestCode() {
747def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        return mTargetRequestCode;
748def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    }
749def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
750def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    /**
751b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Return the Activity this fragment is currently associated with.
752b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
753b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    final public Activity getActivity() {
7542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        return mActivity;
7552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
757b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
758bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * Return <code>getActivity().getResources()</code>.
759bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     */
760bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    final public Resources getResources() {
7615d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        if (mActivity == null) {
7625d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
7635d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        }
764bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn        return mActivity.getResources();
765bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    }
766bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn
767bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    /**
768bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * Return a localized, styled CharSequence from the application's package's
769bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * default string table.
770bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     *
771bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * @param resId Resource id for the CharSequence text
772bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     */
773bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    public final CharSequence getText(int resId) {
774bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn        return getResources().getText(resId);
775bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    }
776bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn
777bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    /**
778bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * Return a localized string from the application's package's
779bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * default string table.
780bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     *
781bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * @param resId Resource id for the string
782bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     */
783bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    public final String getString(int resId) {
784bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn        return getResources().getString(resId);
785bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    }
786bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn
787bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    /**
788bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * Return a localized formatted string from the application's package's
789bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * default string table, substituting the format arguments as defined in
790bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * {@link java.util.Formatter} and {@link java.lang.String#format}.
791bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     *
792bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * @param resId Resource id for the format string
793bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     * @param formatArgs The format arguments that will be used for substitution.
794bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn     */
795bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn
796bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    public final String getString(int resId, Object... formatArgs) {
797bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn        return getResources().getString(resId, formatArgs);
798bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    }
799bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn
800bdd19bc338286e1042f59808545665a061e73ffcDianne Hackborn    /**
801b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Return the FragmentManager for interacting with fragments associated
8023e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn     * with this fragment's activity.  Note that this will be non-null slightly
803625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * before {@link #getActivity()}, during the time from when the fragment is
8043e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn     * placed in a {@link FragmentTransaction} until it is committed and
8053e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn     * attached to its activity.
80662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     *
80762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * <p>If this Fragment is a child of another Fragment, the FragmentManager
80862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * returned here will be the parent's {@link #getChildFragmentManager()}.
809b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
810b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    final public FragmentManager getFragmentManager() {
8113e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        return mFragmentManager;
812b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
813b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
814b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
81562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * Return a private FragmentManager for placing and managing Fragments
81662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * inside of this Fragment.
81762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     */
81862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    final public FragmentManager getChildFragmentManager() {
81962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager == null) {
82062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            instantiateChildFragmentManager();
82162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mState >= RESUMED) {
82262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mChildFragmentManager.dispatchResume();
82362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            } else if (mState >= STARTED) {
82462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mChildFragmentManager.dispatchStart();
82562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            } else if (mState >= ACTIVITY_CREATED) {
82662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mChildFragmentManager.dispatchActivityCreated();
82762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            } else if (mState >= CREATED) {
82862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mChildFragmentManager.dispatchCreate();
82962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
83062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
83162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        return mChildFragmentManager;
83262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
83362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
83462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    /**
8351b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * Returns the parent Fragment containing this Fragment.  If this Fragment
8361b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * is attached directly to an Activity, returns null.
8371b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     */
8381b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    final public Fragment getParentFragment() {
8391b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        return mParentFragment;
8401b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    }
8411b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn
8421b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    /**
8435ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * Return true if the fragment is currently added to its activity.
8445ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     */
845b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    final public boolean isAdded() {
8465d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        return mActivity != null && mAdded;
8475d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn    }
8485d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn
8495d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn    /**
850afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     * Return true if the fragment has been explicitly detached from the UI.
851afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     * That is, {@link FragmentTransaction#detach(Fragment)
852afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     * FragmentTransaction.detach(Fragment)} has been used on it.
853afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     */
854afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    final public boolean isDetached() {
855afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        return mDetached;
856afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    }
857afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn
858afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    /**
8595d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn     * Return true if this fragment is currently being removed from its
8605d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn     * activity.  This is  <em>not</em> whether its activity is finishing, but
8615d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn     * rather whether it is in the process of being removed from its activity.
8625d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn     */
8635d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn    final public boolean isRemoving() {
8645d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        return mRemoving;
8655ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
8665ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
8675ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    /**
868625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Return true if the layout is included as part of an activity view
869625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * hierarchy via the &lt;fragment&gt; tag.  This will always be true when
870625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * fragments are created through the &lt;fragment&gt; tag, <em>except</em>
871625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * in the case where an old fragment is restored from a previous state and
872625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * it does not appear in the layout of the current state.
873625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
874625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    final public boolean isInLayout() {
875625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        return mInLayout;
876625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
877625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
878625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
8792707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn     * Return true if the fragment is in the resumed state.  This is true
8802707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn     * for the duration of {@link #onResume()} and {@link #onPause()} as well.
8812707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn     */
8822707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn    final public boolean isResumed() {
8832707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        return mResumed;
8842707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn    }
8852707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn
8862707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn    /**
8875ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * Return true if the fragment is currently visible to the user.  This means
8885ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * it: (1) has been added, (2) has its view attached to the window, and
8895ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * (3) is not hidden.
8905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     */
891b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    final public boolean isVisible() {
8925ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        return isAdded() && !isHidden() && mView != null
8935ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE;
8945ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
8955ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
8965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    /**
8975ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * Return true if the fragment has been hidden.  By default fragments
8985ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * are shown.  You can find out about changes to this state with
899cddfa6de1fcf1a9480d4c9b575102909bd8f2067Dianne Hackborn     * {@link #onHiddenChanged}.  Note that the hidden state is orthogonal
9005ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * to other states -- that is, to be visible to the user, a fragment
9015ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * must be both started and not hidden.
9025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     */
903b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    final public boolean isHidden() {
9045ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        return mHidden;
9055ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
9065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
9075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    /**
9085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * Called when the hidden state (as returned by {@link #isHidden()} of
9095ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * the fragment has changed.  Fragments start out not hidden; this will
9105ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * be called whenever the fragment changes state from that.
9115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * @param hidden True if the fragment is now hidden, false if it is not
9125ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     * visible.
9135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn     */
9145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    public void onHiddenChanged(boolean hidden) {
9155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
9165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
9175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    /**
918b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Control whether a fragment instance is retained across Activity
919b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * re-creation (such as from a configuration change).  This can only
920b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * be used with fragments not in the back stack.  If set, the fragment
921b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * lifecycle will be slightly different when an activity is recreated:
922b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * <ul>
923b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * <li> {@link #onDestroy()} will not be called (but {@link #onDetach()} still
924b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * will be, because the fragment is being detached from its current activity).
925b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * <li> {@link #onCreate(Bundle)} will not be called since the fragment
926b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * is not being re-created.
927c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * <li> {@link #onAttach(Activity)} and {@link #onActivityCreated(Bundle)} <b>will</b>
928b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * still be called.
929b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * </ul>
930b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
931b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void setRetainInstance(boolean retain) {
93262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (retain && mParentFragment != null) {
93362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new IllegalStateException(
93462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    "Can't retain fragements that are nested in other fragments");
93562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
936b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRetainInstance = retain;
937b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
938b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
939b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    final public boolean getRetainInstance() {
940b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mRetainInstance;
941b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
942b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
943b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
944b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * Report that this fragment would like to participate in populating
9454dc643eb6749afe5211198c920e739475590f92cWink Saville     * the options menu by receiving a call to {@link #onCreateOptionsMenu}
946b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * and related methods.
947b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
948b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @param hasMenu If true, the fragment has menu items to contribute.
949b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
950b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void setHasOptionsMenu(boolean hasMenu) {
951b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mHasMenu != hasMenu) {
952b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            mHasMenu = hasMenu;
953f0f5fffc6f578f531df7b208cfbfb53f884c0380Adam Powell            if (isAdded() && !isHidden()) {
954f0f5fffc6f578f531df7b208cfbfb53f884c0380Adam Powell                mFragmentManager.invalidateOptionsMenu();
955b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
956b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
957b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
9586c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn
9596c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn    /**
9606c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     * Set a hint for whether this fragment's menu should be visible.  This
9616c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     * is useful if you know that a fragment has been placed in your view
9626c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     * hierarchy so that the user can not currently seen it, so any menu items
9636c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     * it has should also not be shown.
9646c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     *
9656c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     * @param menuVisible The default is true, meaning the fragment's menu will
9666c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     * be shown as usual.  If false, the user will not see the menu.
9676c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn     */
9686c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn    public void setMenuVisibility(boolean menuVisible) {
9696c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn        if (mMenuVisible != menuVisible) {
9706c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn            mMenuVisible = menuVisible;
9716c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn            if (mHasMenu && isAdded() && !isHidden()) {
9726c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn                mFragmentManager.invalidateOptionsMenu();
9736c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn            }
9746c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn        }
9756c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn    }
9766c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn
977b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
97878fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * Set a hint to the system about whether this fragment's UI is currently visible
97978fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * to the user. This hint defaults to true and is persistent across fragment instance
98078fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * state save and restore.
981635c60af623c73d2409f5729c0953638b5d6c497Adam Powell     *
98278fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * <p>An app may set this to false to indicate that the fragment's UI is
98378fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * scrolled out of visibility or is otherwise not directly visible to the user.
98478fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * This may be used by the system to prioritize operations such as fragment lifecycle updates
98578fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * or loader ordering behavior.</p>
986635c60af623c73d2409f5729c0953638b5d6c497Adam Powell     *
98778fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * @param isVisibleToUser true if this fragment's UI is currently visible to the user (default),
98878fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     *                        false if it is not.
989635c60af623c73d2409f5729c0953638b5d6c497Adam Powell     */
99078fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell    public void setUserVisibleHint(boolean isVisibleToUser) {
99178fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell        if (!mUserVisibleHint && isVisibleToUser && mState < STARTED) {
992635c60af623c73d2409f5729c0953638b5d6c497Adam Powell            mFragmentManager.performPendingDeferredStart(this);
993635c60af623c73d2409f5729c0953638b5d6c497Adam Powell        }
99478fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell        mUserVisibleHint = isVisibleToUser;
99578fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell        mDeferStart = !isVisibleToUser;
996635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    }
997635c60af623c73d2409f5729c0953638b5d6c497Adam Powell
998635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    /**
99978fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * @return The current value of the user-visible hint on this fragment.
100078fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell     * @see #setUserVisibleHint(boolean)
1001635c60af623c73d2409f5729c0953638b5d6c497Adam Powell     */
100278fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell    public boolean getUserVisibleHint() {
100378fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell        return mUserVisibleHint;
1004635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    }
1005635c60af623c73d2409f5729c0953638b5d6c497Adam Powell
1006635c60af623c73d2409f5729c0953638b5d6c497Adam Powell    /**
1007c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Return the LoaderManager for this fragment, creating it if needed.
1008c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     */
1009c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public LoaderManager getLoaderManager() {
1010c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mLoaderManager != null) {
1011c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            return mLoaderManager;
1012c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
10135d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        if (mActivity == null) {
10145d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
10155d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        }
10165e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        mCheckedForLoaderManager = true;
101762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true);
1018c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        return mLoaderManager;
1019c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
1020a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
1021c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    /**
10226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * Call {@link Activity#startActivity(Intent)} on the fragment's
10236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * containing Activity.
10247a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     *
10257a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * @param intent The intent to start.
10266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
10276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public void startActivity(Intent intent) {
1028a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivity(intent, null);
1029a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
1030a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
1031a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
1032a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Call {@link Activity#startActivity(Intent, Bundle)} on the fragment's
1033a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * containing Activity.
10347a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     *
10357a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * @param intent The intent to start.
10367a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * @param options Additional options for how the Activity should be started.
10377a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * See {@link android.content.Context#startActivity(Intent, Bundle)
10387a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn     * Context.startActivity(Intent, Bundle)} for more details.
1039a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
1040a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent, Bundle options) {
10415d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        if (mActivity == null) {
10425d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
10435d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        }
1044a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (options != null) {
1045a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            mActivity.startActivityFromFragment(this, intent, -1, options);
1046a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        } else {
1047a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // Note we want to go through this call for compatibility with
1048a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // applications that may have overridden the method.
1049a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            mActivity.startActivityFromFragment(this, intent, -1);
1050a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        }
10516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
1052a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
10536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
10546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's
10556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * containing Activity.
10566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
10576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public void startActivityForResult(Intent intent, int requestCode) {
1058a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivityForResult(intent, requestCode, null);
1059a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
1060a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
1061a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    /**
1062a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * Call {@link Activity#startActivityForResult(Intent, int, Bundle)} on the fragment's
1063a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * containing Activity.
1064a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     */
1065a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
10665d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        if (mActivity == null) {
10675d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
10685d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn        }
1069a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (options != null) {
1070a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            mActivity.startActivityFromFragment(this, intent, requestCode, options);
1071a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        } else {
1072a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // Note we want to go through this call for compatibility with
1073a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            // applications that may have overridden the method.
1074a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            mActivity.startActivityFromFragment(this, intent, requestCode, options);
1075a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        }
10766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
10776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
10786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
10796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * Receive the result from a previous call to
10806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * {@link #startActivityForResult(Intent, int)}.  This follows the
10816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * related Activity API as described there in
10826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * {@link Activity#onActivityResult(int, int, Intent)}.
10836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
10846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param requestCode The integer request code originally supplied to
10856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *                    startActivityForResult(), allowing you to identify who this
10866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *                    result came from.
10876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param resultCode The integer result code returned by the child activity
10886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *                   through its setResult().
10896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param data An Intent, which can return result data to the caller
10906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *               (various data can be attached to Intent "extras").
10916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
10926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
10936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
10946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
10956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
10967187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn     * @hide Hack so that DialogFragment can make its Dialog before creating
10977187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn     * its views, and the view construction can use the dialog's context for
10987187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn     * inflation.  Maybe this should become a public API. Note sure.
10997187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn     */
11007187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn    public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
11017187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn        return mActivity.getLayoutInflater();
11027187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn    }
11037187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn
11047187ccb93ee8adbb745fcbb901cfacfeed397a23Dianne Hackborn    /**
1105e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * @deprecated Use {@link #onInflate(Activity, AttributeSet, Bundle)} instead.
1106e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     */
1107e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn    @Deprecated
1108e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn    public void onInflate(AttributeSet attrs, Bundle savedInstanceState) {
1109e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn        mCalled = true;
1110e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn    }
1111e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn
1112e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn    /**
1113b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when a fragment is being created as part of a view layout
11146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * inflation, typically from setting the content view of an activity.  This
1115e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * may be called immediately after the fragment is created from a <fragment>
1116def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * tag in a layout file.  Note this is <em>before</em> the fragment's
1117def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * {@link #onAttach(Activity)} has been called; all you should do here is
1118e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * parse the attributes and save them away.
11196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
1120def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * <p>This is called every time the fragment is inflated, even if it is
1121e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * being inflated into a new instance with saved state.  It typically makes
1122e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * sense to re-parse the parameters each time, to allow them to change with
1123e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * different configurations.</p>
1124e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1125e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * <p>Here is a typical implementation of a fragment that can take parameters
1126e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * both through attributes supplied here as well from {@link #getArguments()}:</p>
1127e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1128e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java
1129e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *      fragment}
1130e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1131e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * <p>Note that parsing the XML attributes uses a "styleable" resource.  The
1132e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * declaration for the styleable used here is:</p>
1133e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1134e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * {@sample development/samples/ApiDemos/res/values/attrs.xml fragment_arguments}
1135b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     *
1136e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * <p>The fragment can then be declared within its activity's content layout
1137e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * through a tag like this:</p>
1138e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1139e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * {@sample development/samples/ApiDemos/res/layout/fragment_arguments.xml from_attributes}
1140e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1141e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * <p>This fragment can also be created dynamically from arguments given
1142e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * at runtime in the arguments Bundle; here is an example of doing so at
1143e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * creation of the containing activity:</p>
1144e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1145e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java
1146e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *      create}
1147e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     *
1148e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn     * @param activity The Activity that is inflating this fragment.
1149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @param attrs The attributes at the tag where the fragment is
1150b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * being created.
11516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param savedInstanceState If the fragment is being re-created from
11526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * a previous saved state, this is the state.
1153b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
1154e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
1155e3a7f628c6d9fef42be24999b3137ebe5c6f3525Dianne Hackborn        onInflate(attrs, savedInstanceState);
1156ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        mCalled = true;
1157ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
1158ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
1159b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1160b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when a fragment is first attached to its activity.
1161b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * {@link #onCreate(Bundle)} will be called after this.
1162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
11632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onAttach(Activity activity) {
11642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
11652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
11662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1167811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase    /**
1168811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase     * Called when a fragment loads an animation.
1169811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase     */
1170a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
1171f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return null;
1172f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
1173f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
1174b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called to do initial creation of a fragment.  This is called after
1176c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * {@link #onAttach(Activity)} and before
1177c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
1178c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     *
1179c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * <p>Note that this can be called while the fragment's activity is
1180c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * still in the process of being created.  As such, you can not rely
1181c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * on things like the activity's content view hierarchy being initialized
1182c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * at this point.  If you want to do work once the activity itself is
1183c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * created, see {@link #onActivityCreated(Bundle)}.
1184c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     *
1185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @param savedInstanceState If the fragment is being re-created from
1186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * a previous saved state, this is the state.
1187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
11882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
11892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
11902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
11911b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn
119216f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn    /**
1193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called to have the fragment instantiate its user interface view.
1194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * This is optional, and non-graphical fragments can return null (which
1195b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * is the default implementation).  This will be called between
1196c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * {@link #onCreate(Bundle)} and {@link #onActivityCreated(Bundle)}.
1197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     *
11985ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * <p>If you return a View from here, you will later be called in
11995ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * {@link #onDestroyView} when the view is being released.
12005ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     *
1201b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @param inflater The LayoutInflater object that can be used to inflate
1202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * any views in the fragment,
1203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @param container If non-null, this is the parent view that the fragment's
1204b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * UI should be attached to.  The fragment should not add the view itself,
1205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * but this can be used to generate the LayoutParams of the view.
1206b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @param savedInstanceState If non-null, this fragment is being re-constructed
1207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * from a previous saved state as given here.
1208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     *
1209b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @return Return the View for the fragment's UI, or null.
1210b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
1211b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1212b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            Bundle savedInstanceState) {
12132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        return null;
12142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
12151b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn
12161b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    /**
12171b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}
12181b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * has returned, but before any saved state has been restored in to the view.
12191b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * This gives subclasses a chance to initialize themselves once
12201b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * they know their view hierarchy has been completely created.  The fragment's
12211b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * view hierarchy is not however attached to its parent at this point.
12221b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
12231b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * @param savedInstanceState If non-null, this fragment is being re-constructed
12241b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     * from a previous saved state as given here.
12251b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     */
12261b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    public void onViewCreated(View view, Bundle savedInstanceState) {
12271b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    }
12282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1229662cc7a46a44af782a1f697d16b0613498312e1fScott Main    /**
1230662cc7a46a44af782a1f697d16b0613498312e1fScott Main     * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
1231662cc7a46a44af782a1f697d16b0613498312e1fScott Main     * if provided.
1232662cc7a46a44af782a1f697d16b0613498312e1fScott Main     *
1233662cc7a46a44af782a1f697d16b0613498312e1fScott Main     * @return The fragment's root view, or null if it has no layout.
1234662cc7a46a44af782a1f697d16b0613498312e1fScott Main     */
1235b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public View getView() {
1236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mView;
1237b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1238b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1239b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1240c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * Called when the fragment's activity has been created and this
1241c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * fragment's view hierarchy instantiated.  It can be used to do final
1242c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * initialization once these pieces are in place, such as retrieving
1243c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * views or restoring state.  It is also useful for fragments that use
1244c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * {@link #setRetainInstance(boolean)} to retain their instance,
1245c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn     * as this callback tells the fragment when it is fully associated with
12465ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * the new activity instance.  This is called after {@link #onCreateView}
124762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * and before {@link #onViewStateRestored(Bundle)}.
12481b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     *
1249b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * @param savedInstanceState If the fragment is being re-created from
1250b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * a previous saved state, this is the state.
1251b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
1252c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public void onActivityCreated(Bundle savedInstanceState) {
1253b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mCalled = true;
12542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
125562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
125662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    /**
125762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * Called when all saved state has been restored into the view hierarchy
125862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * of the fragment.  This can be used to do initialization based on saved
125962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * state that you are letting the view hierarchy track itself, such as
126062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * whether check box widgets are currently checked.  This is called
126162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * after {@link #onActivityCreated(Bundle)} and before
126262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * {@link #onStart()}.
12631b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn     *
126462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * @param savedInstanceState If the fragment is being re-created from
126562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     * a previous saved state, this is the state.
126662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn     */
126762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    public void onViewStateRestored(Bundle savedInstanceState) {
126862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = true;
126962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
127062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
1271b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1272b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when the Fragment is visible to the user.  This is generally
1273b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * tied to {@link Activity#onStart() Activity.onStart} of the containing
1274b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Activity's lifecycle.
1275b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
12762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onStart() {
12772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
1278fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn
1279fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (!mLoadersStarted) {
1280fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = true;
1281fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (!mCheckedForLoaderManager) {
1282fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mCheckedForLoaderManager = true;
128362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, false);
1284fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
1285fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            if (mLoaderManager != null) {
1286fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                mLoaderManager.doStart();
1287fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            }
1288c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
12892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
12902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1291b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1292b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when the fragment is visible to the user and actively running.
1293b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * This is generally
1294b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * tied to {@link Activity#onResume() Activity.onResume} of the containing
1295b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Activity's lifecycle.
1296b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
12972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onResume() {
12982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
12992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1301727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn    /**
1302727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * Called to ask the fragment to save its current dynamic state, so it
1303727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * can later be reconstructed in a new instance of its process is
1304727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * restarted.  If a new instance of the fragment later needs to be
1305727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * created, the data you place in the Bundle here will be available
1306727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * in the Bundle given to {@link #onCreate(Bundle)},
1307727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}, and
1308727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * {@link #onActivityCreated(Bundle)}.
1309727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     *
1310727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * <p>This corresponds to {@link Activity#onSaveInstanceState(Bundle)
13112f761760459fe27c8e9f96569bb7f28fc5b58babDaisuke Miyakawa     * Activity.onSaveInstanceState(Bundle)} and most of the discussion there
1312727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * applies here as well.  Note however: <em>this method may be called
1313727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * at any time before {@link #onDestroy()}</em>.  There are many situations
1314727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * where a fragment may be mostly torn down (such as when placed on the
1315727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * back stack with no UI showing), but its state will not be saved until
1316727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * its owning activity actually needs to save its state.
1317727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     *
1318727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     * @param outState Bundle in which to place your saved state.
1319727782053ced0cac5beadc2c7ee9382d0f1ba1f5Dianne Hackborn     */
13202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onSaveInstanceState(Bundle outState) {
13212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
13232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onConfigurationChanged(Configuration newConfig) {
13242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
13252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1327b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1328b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when the Fragment is no longer resumed.  This is generally
1329b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * tied to {@link Activity#onPause() Activity.onPause} of the containing
1330b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Activity's lifecycle.
1331b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
13322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onPause() {
13332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
13342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1336b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1337b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when the Fragment is no longer started.  This is generally
1338b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * tied to {@link Activity#onStop() Activity.onStop} of the containing
1339b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Activity's lifecycle.
1340b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
13412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onStop() {
13422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
13432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
13452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onLowMemory() {
13462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
13472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1349c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void onTrimMemory(int level) {
1350c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        mCalled = true;
1351c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
1352c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
1353b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
13545ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Called when the view previously created by {@link #onCreateView} has
13555ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * been detached from the fragment.  The next time the fragment needs
13565ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * to be displayed, a new view will be created.  This is called
1357def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * after {@link #onStop()} and before {@link #onDestroy()}.  It is called
1358def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * <em>regardless</em> of whether {@link #onCreateView} returned a
1359def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * non-null view.  Internally it is called after the view's state has
1360def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * been saved but before it has been removed from its parent.
13615ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     */
13625ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    public void onDestroyView() {
13635ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        mCalled = true;
13645ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    }
13655ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn
13665ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    /**
1367b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when the fragment is no longer in use.  This is called
1368b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * after {@link #onStop()} and before {@link #onDetach()}.
1369b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
13702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onDestroy() {
13712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
13725e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        //Log.v("foo", "onDestroy: mCheckedForLoaderManager=" + mCheckedForLoaderManager
13735e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        //        + " mLoaderManager=" + mLoaderManager);
13745e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        if (!mCheckedForLoaderManager) {
13755e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            mCheckedForLoaderManager = true;
137662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, false);
13775e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        }
1378c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        if (mLoaderManager != null) {
1379c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn            mLoaderManager.doDestroy();
1380c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        }
13812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
1383b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    /**
1384afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     * Called by the fragment manager once this fragment has been removed,
1385afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     * so that we don't have any left-over state if the application decides
1386afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     * to re-use the instance.  This only clears state that the framework
1387afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     * internally manages, not things the application sets.
1388afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn     */
1389afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    void initState() {
1390afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mIndex = -1;
1391afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mWho = null;
1392afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mAdded = false;
1393afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mRemoving = false;
1394afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mResumed = false;
1395afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mFromLayout = false;
1396afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mInLayout = false;
1397afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mRestored = false;
1398afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mBackStackNesting = 0;
1399afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mFragmentManager = null;
14006c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn        mActivity = null;
1401afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mFragmentId = 0;
1402afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mContainerId = 0;
1403afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mTag = null;
1404afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mHidden = false;
1405afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mDetached = false;
1406afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mRetaining = false;
1407afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mLoaderManager = null;
1408afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mLoadersStarted = false;
1409afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        mCheckedForLoaderManager = false;
1410afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    }
1411afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn
1412afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    /**
1413b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * Called when the fragment is no longer attached to its activity.  This
1414b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     * is called after {@link #onDestroy()}.
1415b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn     */
14162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void onDetach() {
14172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCalled = true;
14182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1419b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
1420b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
1421b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * Initialize the contents of the Activity's standard options menu.  You
1422b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * should place your menu items in to <var>menu</var>.  For this method
14235ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * to be called, you must have first called {@link #setHasOptionsMenu}.  See
14245ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * {@link Activity#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu}
14255ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * for more information.
1426b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
1427b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @param menu The options menu in which you place your items.
1428b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
14294dc643eb6749afe5211198c920e739475590f92cWink Saville     * @see #setHasOptionsMenu
1430b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @see #onPrepareOptionsMenu
1431b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @see #onOptionsItemSelected
1432b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
1433b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1434b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
1435b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
1436b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
1437b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * Prepare the Screen's standard options menu to be displayed.  This is
1438b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * called right before the menu is shown, every time it is shown.  You can
1439b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * use this method to efficiently enable/disable items or otherwise
1440b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * dynamically modify the contents.  See
1441b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * {@link Activity#onPrepareOptionsMenu(Menu) Activity.onPrepareOptionsMenu}
1442b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * for more information.
1443b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
1444b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @param menu The options menu as last shown or first initialized by
1445b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *             onCreateOptionsMenu().
1446b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
14474dc643eb6749afe5211198c920e739475590f92cWink Saville     * @see #setHasOptionsMenu
1448b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @see #onCreateOptionsMenu
1449b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
1450b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
1451b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
1452b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
1453b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
14548eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn     * Called when this fragment's option menu items are no longer being
14558eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn     * included in the overall options menu.  Receiving this call means that
14568eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn     * the menu needed to be rebuilt, but this fragment's items were not
14578eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn     * included in the newly built menu (its {@link #onCreateOptionsMenu(Menu, MenuInflater)}
14588eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn     * was not called).
14598eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn     */
14608eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn    public void onDestroyOptionsMenu() {
14618eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn    }
14628eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn
14638eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn    /**
1464b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * This hook is called whenever an item in your options menu is selected.
1465b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * The default implementation simply returns false to have the normal
1466b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * processing happen (calling the item's Runnable or sending a message to
1467b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * its Handler as appropriate).  You can use this method for any items
1468b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * for which you would like to do processing without those other
1469b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * facilities.
1470b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
1471b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * <p>Derived classes should call through to the base class for it to
1472b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * perform the default menu handling.
1473b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
1474b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @param item The menu item that was selected.
1475b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
1476b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @return boolean Return false to allow normal menu processing to
1477b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *         proceed, true to consume it here.
1478b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
1479b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @see #onCreateOptionsMenu
1480b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
1481b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public boolean onOptionsItemSelected(MenuItem item) {
1482b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        return false;
1483b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
1484b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
1485b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    /**
1486b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * This hook is called whenever the options menu is being closed (either by the user canceling
1487b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * the menu with the back/menu button, or when an item is selected).
1488b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *
1489b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     * @param menu The options menu as last shown or first initialized by
1490b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     *             onCreateOptionsMenu().
1491b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn     */
1492b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void onOptionsMenuClosed(Menu menu) {
1493b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
14945ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn
14955ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    /**
14965ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Called when a context menu for the {@code view} is about to be shown.
14975ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Unlike {@link #onCreateOptionsMenu}, this will be called every
14985ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * time the context menu is about to be shown and should be populated for
14995ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * the view (or item inside the view for {@link AdapterView} subclasses,
15005ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * this can be found in the {@code menuInfo})).
15015ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * <p>
15025ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
15035ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * item has been selected.
15045ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * <p>
15055ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * The default implementation calls up to
15065ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * {@link Activity#onCreateContextMenu Activity.onCreateContextMenu}, though
15075ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * you can not call this implementation if you don't want that behavior.
15085ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * <p>
15095ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * It is not safe to hold onto the context menu after this method returns.
15105ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * {@inheritDoc}
15115ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     */
15125ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
15135ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        getActivity().onCreateContextMenu(menu, v, menuInfo);
15145ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    }
15155ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn
15165ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    /**
15175ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Registers a context menu to be shown for the given view (multiple views
15185ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * can show the context menu). This method will set the
15195ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * {@link OnCreateContextMenuListener} on the view to this fragment, so
15205ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
15215ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * called when it is time to show the context menu.
15225ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     *
15235ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * @see #unregisterForContextMenu(View)
15245ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * @param view The view that should show a context menu.
15255ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     */
15265ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    public void registerForContextMenu(View view) {
15275ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        view.setOnCreateContextMenuListener(this);
15285ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    }
15295ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn
15305ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    /**
15315ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Prevents a context menu to be shown for the given view. This method will
15325ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * remove the {@link OnCreateContextMenuListener} on the view.
15335ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     *
15345ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * @see #registerForContextMenu(View)
15355ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * @param view The view that should stop showing a context menu.
15365ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     */
15375ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    public void unregisterForContextMenu(View view) {
15385ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        view.setOnCreateContextMenuListener(null);
15395ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    }
15405ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn
15415ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    /**
15425ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * This hook is called whenever an item in a context menu is selected. The
15435ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * default implementation simply returns false to have the normal processing
15445ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * happen (calling the item's Runnable or sending a message to its Handler
15455ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * as appropriate). You can use this method for any items for which you
15465ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * would like to do processing without those other facilities.
15475ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * <p>
15485ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
15495ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * View that added this menu item.
15505ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * <p>
15515ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * Derived classes should call through to the base class for it to perform
15525ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * the default menu handling.
15535ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     *
15545ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * @param item The context menu item that was selected.
15555ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     * @return boolean Return false to allow normal context menu processing to
15565ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     *         proceed, true to consume it here.
15575ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn     */
15585ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    public boolean onContextItemSelected(MenuItem item) {
15595ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        return false;
15605ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    }
15612707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn
1562625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
1563625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Print the Fragments's state into the given stream.
1564625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
1565625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param prefix Text to print at the front of each line.
1566625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param fd The raw file descriptor that the dump is being sent to.
1567625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param writer The PrintWriter to which you should dump your state.  This will be
1568625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * closed for you after you return.
1569625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param args additional arguments to the dump request.
1570625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
1571625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
157230d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn        writer.print(prefix); writer.print("mFragmentId=#");
157330d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(Integer.toHexString(mFragmentId));
1574ee76efb74b5886f98cdfebfbefe9b69224e016fbDianne Hackborn                writer.print(" mContainerId=#");
157530d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn                writer.print(Integer.toHexString(mContainerId));
1576625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mTag="); writer.println(mTag);
1577625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        writer.print(prefix); writer.print("mState="); writer.print(mState);
1578625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mIndex="); writer.print(mIndex);
1579625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mWho="); writer.print(mWho);
1580625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mBackStackNesting="); writer.println(mBackStackNesting);
1581625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        writer.print(prefix); writer.print("mAdded="); writer.print(mAdded);
15825d9d03a0234faa3cffd11502f973057045cafe82Dianne Hackborn                writer.print(" mRemoving="); writer.print(mRemoving);
1583625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mResumed="); writer.print(mResumed);
1584625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mFromLayout="); writer.print(mFromLayout);
1585625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mInLayout="); writer.println(mInLayout);
1586625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        writer.print(prefix); writer.print("mHidden="); writer.print(mHidden);
158716f6e89c2a4bbf73fe15cb2e81c8fec98c7ac831Dianne Hackborn                writer.print(" mDetached="); writer.print(mDetached);
15886c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn                writer.print(" mMenuVisible="); writer.print(mMenuVisible);
1589625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(" mHasMenu="); writer.println(mHasMenu);
15906c285977a0dc9605348bd9530282c7d006cbf8bdDianne Hackborn        writer.print(prefix); writer.print("mRetainInstance="); writer.print(mRetainInstance);
159178fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell                writer.print(" mRetaining="); writer.print(mRetaining);
159278fed9b78f8b3b92979b94dda2640cdeaffb2573Adam Powell                writer.print(" mUserVisibleHint="); writer.println(mUserVisibleHint);
1593625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mFragmentManager != null) {
1594625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mFragmentManager=");
1595625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.println(mFragmentManager);
1596625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1597625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mActivity != null) {
1598625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mActivity=");
1599625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.println(mActivity);
1600625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
160162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mParentFragment != null) {
160262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            writer.print(prefix); writer.print("mParentFragment=");
160362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    writer.println(mParentFragment);
160462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
1605625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mArguments != null) {
1606625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mArguments="); writer.println(mArguments);
1607625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1608625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mSavedFragmentState != null) {
1609625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mSavedFragmentState=");
1610625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.println(mSavedFragmentState);
1611625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1612625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mSavedViewState != null) {
1613625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mSavedViewState=");
1614625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.println(mSavedViewState);
1615625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1616625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mTarget != null) {
1617625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mTarget="); writer.print(mTarget);
1618625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.print(" mTargetRequestCode=");
1619625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.println(mTargetRequestCode);
1620625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1621625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mNextAnim != 0) {
1622625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mNextAnim="); writer.println(mNextAnim);
1623625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1624625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mContainer != null) {
1625625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mContainer="); writer.println(mContainer);
1626625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1627625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mView != null) {
1628625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            writer.print(prefix); writer.print("mView="); writer.println(mView);
1629625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
1630d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn        if (mAnimatingAway != null) {
1631d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn            writer.print(prefix); writer.print("mAnimatingAway="); writer.println(mAnimatingAway);
1632d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn            writer.print(prefix); writer.print("mStateAfterAnimating=");
1633d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn                    writer.println(mStateAfterAnimating);
1634d173fa3b1cb8e4294aba7564c0171894be6c3c24Dianne Hackborn        }
1635625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mLoaderManager != null) {
163630d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn            writer.print(prefix); writer.println("Loader Manager:");
163730d7189067524000c738c188c4ff91f84f474d25Dianne Hackborn            mLoaderManager.dump(prefix + "  ", fd, writer, args);
1638625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
163962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
16401b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn            writer.print(prefix); writer.println("Child " + mChildFragmentManager + ":");
164162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dump(prefix + "  ", fd, writer, args);
164262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
164362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
164462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
164562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    Fragment findFragmentByWho(String who) {
164662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (who.equals(mWho)) {
164762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            return this;
164862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
164962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
165062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            return mChildFragmentManager.findFragmentByWho(who);
165162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
165262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        return null;
165362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
165462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
165562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void instantiateChildFragmentManager() {
165662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mChildFragmentManager = new FragmentManagerImpl();
165762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mChildFragmentManager.attachActivity(mActivity, new FragmentContainer() {
165862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            @Override
165962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            public View findViewById(int id) {
166062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                if (mView == null) {
166162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    throw new IllegalStateException("Fragment does not have a view");
166262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                }
166362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                return mView.findViewById(id);
166462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
166562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }, this);
166662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
166762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
166862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performCreate(Bundle savedInstanceState) {
16691b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        if (mChildFragmentManager != null) {
16701b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn            mChildFragmentManager.noteStateNotSaved();
16711b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        }
167262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
167362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onCreate(savedInstanceState);
167462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
167562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
167662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onCreate()");
167762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
167862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (savedInstanceState != null) {
167962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            Parcelable p = savedInstanceState.getParcelable(Activity.FRAGMENTS_TAG);
168062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (p != null) {
168162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                if (mChildFragmentManager == null) {
168262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    instantiateChildFragmentManager();
168362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                }
168462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mChildFragmentManager.restoreAllState(p, null);
168562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mChildFragmentManager.dispatchCreate();
168662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
168762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
168862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
168962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
16901b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    View performCreateView(LayoutInflater inflater, ViewGroup container,
16911b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn            Bundle savedInstanceState) {
16921b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        if (mChildFragmentManager != null) {
16931b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn            mChildFragmentManager.noteStateNotSaved();
16941b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        }
16951b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        return onCreateView(inflater, container, savedInstanceState);
16961b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn    }
16971b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn
169862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performActivityCreated(Bundle savedInstanceState) {
16991b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        if (mChildFragmentManager != null) {
17001b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn            mChildFragmentManager.noteStateNotSaved();
17011b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn        }
170262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
170362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onActivityCreated(savedInstanceState);
170462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
170562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
170662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onActivityCreated()");
170762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
170862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
170962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchActivityCreated();
171062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
1711625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
1712625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
1713afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    void performStart() {
171462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
171562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.noteStateNotSaved();
171662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.execPendingActions();
171762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
171862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
1719afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        onStart();
172062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
172162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
172262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onStart()");
172362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
172462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
172562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchStart();
172662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
1727afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        if (mLoaderManager != null) {
1728afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn            mLoaderManager.doReportStart();
1729afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        }
1730afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    }
1731afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn
173262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performResume() {
173362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
17341b8ecc5031051b4bba620fac27552e84ca666496Dianne Hackborn            mChildFragmentManager.noteStateNotSaved();
173562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.execPendingActions();
173662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
173762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
173862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onResume();
173962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
174062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
174162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onResume()");
174262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
174362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
174462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchResume();
174562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.execPendingActions();
174662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
174762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
174862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
174962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performConfigurationChanged(Configuration newConfig) {
175062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onConfigurationChanged(newConfig);
175162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
175262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchConfigurationChanged(newConfig);
175362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
175462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
175562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
175662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performLowMemory() {
175762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onLowMemory();
175862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
175962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchLowMemory();
176062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
176162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
176262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
176362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performTrimMemory(int level) {
176462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onTrimMemory(level);
176562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
176662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchTrimMemory(level);
176762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
176862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
176962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
177062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    boolean performCreateOptionsMenu(Menu menu, MenuInflater inflater) {
177162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        boolean show = false;
177262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mHidden) {
177362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mHasMenu && mMenuVisible) {
177462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                show = true;
177562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                onCreateOptionsMenu(menu, inflater);
177662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
177762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mChildFragmentManager != null) {
177862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                show |= mChildFragmentManager.dispatchCreateOptionsMenu(menu, inflater);
177962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
178062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
178162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        return show;
178262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
178362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
178462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    boolean performPrepareOptionsMenu(Menu menu) {
178562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        boolean show = false;
178662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mHidden) {
178762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mHasMenu && mMenuVisible) {
178862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                show = true;
178962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                onPrepareOptionsMenu(menu);
179062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
179162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mChildFragmentManager != null) {
179262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                show |= mChildFragmentManager.dispatchPrepareOptionsMenu(menu);
179362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
179462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
179562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        return show;
179662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
179762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
179862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    boolean performOptionsItemSelected(MenuItem item) {
179962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mHidden) {
180062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mHasMenu && mMenuVisible) {
180162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                if (onOptionsItemSelected(item)) {
180262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    return true;
180362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                }
180462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
180562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mChildFragmentManager != null) {
180662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                if (mChildFragmentManager.dispatchOptionsItemSelected(item)) {
180762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    return true;
180862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                }
180962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
181062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
181162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        return false;
181262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
181362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
181462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    boolean performContextItemSelected(MenuItem item) {
181562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mHidden) {
181662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (onContextItemSelected(item)) {
181762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                return true;
181862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
181962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mChildFragmentManager != null) {
182062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                if (mChildFragmentManager.dispatchContextItemSelected(item)) {
182162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    return true;
182262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                }
182362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
182462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
182562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        return false;
182662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
182762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
182862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performOptionsMenuClosed(Menu menu) {
182962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mHidden) {
183062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mHasMenu && mMenuVisible) {
183162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                onOptionsMenuClosed(menu);
183262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
183362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (mChildFragmentManager != null) {
183462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mChildFragmentManager.dispatchOptionsMenuClosed(menu);
183562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
183662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
183762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
183862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
183962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performSaveInstanceState(Bundle outState) {
184062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onSaveInstanceState(outState);
184162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
184262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            Parcelable p = mChildFragmentManager.saveAllState();
184362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            if (p != null) {
184462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                outState.putParcelable(Activity.FRAGMENTS_TAG, p);
184562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            }
184662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
184762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
184862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
184962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performPause() {
185062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
185162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchPause();
185262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
185362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
185462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onPause();
185562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
185662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
185762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onPause()");
185862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
185962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
186062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
18612707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn    void performStop() {
186262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
186362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchStop();
186462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
186562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
18662707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        onStop();
186762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
186862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
186962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onStop()");
187062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
1871fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn
1872fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (mLoadersStarted) {
1873fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            mLoadersStarted = false;
18745e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            if (!mCheckedForLoaderManager) {
18755e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn                mCheckedForLoaderManager = true;
187662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, false);
18775e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            }
18782707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            if (mLoaderManager != null) {
18792707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                if (mActivity == null || !mActivity.mChangingConfigurations) {
18802707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doStop();
18812707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                } else {
18822707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                    mLoaderManager.doRetain();
18832707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                }
18842707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn            }
18852707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn        }
18862707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn    }
1887afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn
1888afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    void performDestroyView() {
188962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
189062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchDestroyView();
189162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
189262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
1893afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        onDestroyView();
189462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
189562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
189662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onDestroyView()");
189762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
1898afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        if (mLoaderManager != null) {
1899afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn            mLoaderManager.doReportNextStart();
1900afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn        }
1901afc4b283fdaedec9bf32492a019b43cc33edc9b6Dianne Hackborn    }
190262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn
190362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    void performDestroy() {
190462bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (mChildFragmentManager != null) {
190562bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            mChildFragmentManager.dispatchDestroy();
190662bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
190762bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        mCalled = false;
190862bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        onDestroy();
190962bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        if (!mCalled) {
191062bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn            throw new SuperNotCalledException("Fragment " + this
191162bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn                    + " did not call through to super.onDestroy()");
191262bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn        }
191362bea2f1710be0d1a42c07109fd4307ded660d3bDianne Hackborn    }
19142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn}
1915