Fragment.java revision e0f27d39b0a4f0ef30ef6446e7b675279961cc94
18872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger/* 28872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Copyright (C) 2011 The Android Open Source Project 38872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 48872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License"); 58872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * you may not use this file except in compliance with the License. 68872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * You may obtain a copy of the License at 78872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 88872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * http://www.apache.org/licenses/LICENSE-2.0 98872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 108872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Unless required by applicable law or agreed to in writing, software 118872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS, 128872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * See the License for the specific language governing permissions and 148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * limitations under the License. 158872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 168872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 178872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerpackage android.support.v4.app; 188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 19849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.app.Activity; 20849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.content.ComponentCallbacks; 21849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.content.Context; 22849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.content.Intent; 23849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.content.res.Configuration; 24849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.content.res.Resources; 25849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.os.Bundle; 26849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.os.Parcel; 27849911a9c4315fc552faa38516c842b2541b1909John Reckimport android.os.Parcelable; 288872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport android.support.v4.util.DebugUtils; 298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport android.util.AttributeSet; 308872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport android.util.Log; 318872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport android.util.SparseArray; 328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport android.view.ContextMenu; 338872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport android.view.LayoutInflater; 3418981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.view.Menu; 358872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport android.view.MenuInflater; 3618981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.view.MenuItem; 3718981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.view.View; 3818981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.view.ViewGroup; 3918981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.view.ContextMenu.ContextMenuInfo; 4018981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.view.View.OnCreateContextMenuListener; 4118981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.view.animation.Animation; 4218981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport android.widget.AdapterView; 4318981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins III 448872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport java.io.FileDescriptor; 4518981294a58c411a4a33ebb22caf9c75ba639691Leon Scroggins IIIimport java.io.PrintWriter; 468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerimport java.util.HashMap; 478872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 48b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenbergerfinal class FragmentState implements Parcelable { 498872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final String mClassName; 508872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final int mIndex; 518872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final boolean mFromLayout; 52b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger final int mFragmentId; 538872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final int mContainerId; 54b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger final String mTag; 55b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger final boolean mRetainInstance; 56b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger final boolean mDetached; 578872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final Bundle mArguments; 58b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 59b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger Bundle mSavedFragmentState; 60b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 61b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger Fragment mInstance; 628872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 638872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public FragmentState(Fragment frag) { 64b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mClassName = frag.getClass().getName(); 658872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mIndex = frag.mIndex; 66b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mFromLayout = frag.mFromLayout; 67b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mFragmentId = frag.mFragmentId; 68b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mContainerId = frag.mContainerId; 69b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mTag = frag.mTag; 70b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mRetainInstance = frag.mRetainInstance; 71b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mDetached = frag.mDetached; 72b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mArguments = frag.mArguments; 73b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger } 74b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 75b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger public FragmentState(Parcel in) { 76b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mClassName = in.readString(); 77b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mIndex = in.readInt(); 78b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mFromLayout = in.readInt() != 0; 79b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mFragmentId = in.readInt(); 80b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mContainerId = in.readInt(); 81b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mTag = in.readString(); 82b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mRetainInstance = in.readInt() != 0; 83b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mDetached = in.readInt() != 0; 84b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mArguments = in.readBundle(); 85b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mSavedFragmentState = in.readBundle(); 86b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger } 87b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 88b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger public Fragment instantiate(FragmentActivity activity, Fragment parent) { 89b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger if (mInstance != null) { 90b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger return mInstance; 91b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger } 928872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 93b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger if (mArguments != null) { 94b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mArguments.setClassLoader(activity.getClassLoader()); 95b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger } 96b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mInstance = Fragment.instantiate(activity, mClassName, mArguments); 98b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 99b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger if (mSavedFragmentState != null) { 100b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mSavedFragmentState.setClassLoader(activity.getClassLoader()); 101b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mInstance.mSavedFragmentState = mSavedFragmentState; 1028872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 103b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mInstance.setIndex(mIndex, parent); 104b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mInstance.mFromLayout = mFromLayout; 1058872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mInstance.mRestored = true; 1068872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mInstance.mFragmentId = mFragmentId; 107b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mInstance.mContainerId = mContainerId; 1088872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mInstance.mTag = mTag; 109b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mInstance.mRetainInstance = mRetainInstance; 110b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mInstance.mDetached = mDetached; 111b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger mInstance.mFragmentManager = activity.mFragments; 112b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 1138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG, 1148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger "Instantiated fragment " + mInstance); 115b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 1168872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mInstance; 117b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger } 1188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 119acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger public int describeContents() { 120acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger return 0; 1218dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 122b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger 1238872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public void writeToParcel(Parcel dest, int flags) { 124b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger dest.writeString(mClassName); 1258872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dest.writeInt(mIndex); 126b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger dest.writeInt(mFromLayout ? 1 : 0); 127acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger dest.writeInt(mFragmentId); 128b3d50e007523d1ada0866d384c391c72ac1a3577Derek Sollenberger dest.writeInt(mContainerId); 1298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dest.writeString(mTag); 1308872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dest.writeInt(mRetainInstance ? 1 : 0); 1318872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dest.writeInt(mDetached ? 1 : 0); 1328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dest.writeBundle(mArguments); 1338872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dest.writeBundle(mSavedFragmentState); 1348872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 1358872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1368872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public static final Parcelable.Creator<FragmentState> CREATOR 1378872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger = new Parcelable.Creator<FragmentState>() { 1388872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public FragmentState createFromParcel(Parcel in) { 1398872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return new FragmentState(in); 140acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger } 1418872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 142acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger public FragmentState[] newArray(int size) { 1438872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return new FragmentState[size]; 1448872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 1458872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger }; 1468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger} 1478872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1488872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger/** 1498872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Static library support version of the framework's {@link android.app.Fragment}. 1508872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Used to write apps that run on platforms prior to Android 3.0. When running 1518872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * on Android 3.0 or above, this implementation is still used; it does not try 1528872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * to switch to the framework's implementation. See the framework SDK 1538872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * documentation for a class overview. 1548872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 1558872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenbergerpublic class Fragment implements ComponentCallbacks, OnCreateContextMenuListener { 1568872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger private static final HashMap<String, Class<?>> sClassMap = 1578872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger new HashMap<String, Class<?>>(); 1588872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1598872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger static final int INITIALIZING = 0; // Not yet created. 1608872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger static final int CREATED = 1; // Created. 1618872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger static final int ACTIVITY_CREATED = 2; // The activity has finished its creation. 1628872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger static final int STOPPED = 3; // Fully created, not started. 1638872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger static final int STARTED = 4; // Created and started, not resumed. 1648872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger static final int RESUMED = 5; // Created started and resumed. 1658872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1668872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mState = INITIALIZING; 1678872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1688872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Non-null if the fragment's view hierarchy is currently animating away, 1698872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // meaning we need to wait a bit on completely destroying it. This is the 1708872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // view that is animating. 1718872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger View mAnimatingAway; 1728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1738872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // If mAnimatingAway != null, this is the state we should move to once the 1748872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // animation is done. 1758872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mStateAfterAnimating; 1768872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1778872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // When instantiated from saved state, this is the saved state. 1788872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger Bundle mSavedFragmentState; 1798872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger SparseArray<Parcelable> mSavedViewState; 1808872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1818872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Index into active fragment array. 1828872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mIndex = -1; 1838872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1848872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Internal unique name for this fragment; 1858872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger String mWho; 1868872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1878872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Construction arguments; 1888872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger Bundle mArguments; 1898872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1908872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Target fragment. 1918872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger Fragment mTarget; 1928872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1938872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // For use when retaining a fragment: this is the index of the last mTarget. 1948872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mTargetIndex = -1; 1958872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1968872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Target request code. 1978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mTargetRequestCode; 1988872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 1998872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // True if the fragment is in the list of added fragments. 2008872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mAdded; 2018872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2028872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // If set this fragment is being removed from its activity. 2038872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mRemoving; 2048872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2058872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // True if the fragment is in the resumed state. 2068872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mResumed; 2078872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2088872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Set to true if this fragment was instantiated from a layout file. 2098872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mFromLayout; 2108872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2118872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Set to true when the view has actually been inflated in its layout. 2128872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mInLayout; 2138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // True if this fragment has been restored from previously saved state. 2158872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mRestored; 2168872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2178872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Number of active back stack entries this fragment is in. 2188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mBackStackNesting; 2198872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2208872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // The fragment manager we are associated with. Set as soon as the 2218872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // fragment is used in a transaction; cleared after it has been removed 2228872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // from all transactions. 2238872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger FragmentManagerImpl mFragmentManager; 2248872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2258872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Activity this fragment is attached to. 2268872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger FragmentActivity mActivity; 2278872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2288872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Private fragment manager for child fragments inside of this one. 2298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger FragmentManagerImpl mChildFragmentManager; 2308872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2318872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // If this Fragment is contained in another Fragment, this is that container. 2328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger Fragment mParentFragment; 2338872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2348872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // The optional identifier for this fragment -- either the container ID if it 2358872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // was dynamically added to the view hierarchy, or the ID supplied in 2368872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // layout. 2378872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mFragmentId; 2388872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2398872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // When a fragment is being dynamically added to the view hierarchy, this 2408872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // is the identifier of the parent container it is being added to. 2418872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mContainerId; 2428872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2438872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // The optional named tag for this fragment -- usually used to find 2448872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // fragments that are not part of the layout. 2458872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger String mTag; 2468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2478872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Set to true when the app has requested that this fragment be hidden 2488872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // from the user. 2498872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mHidden; 2508872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2518872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Set to true when the app has requested that this fragment be deactivated. 2528872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mDetached; 2538872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2548872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // If set this fragment would like its instance retained across 2558872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // configuration changes. 2568872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mRetainInstance; 2578872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2588872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // If set this fragment is being retained across the current config change. 2598872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mRetaining; 2608872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2618872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // If set this fragment has menu items to contribute. 2628872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mHasMenu; 2638872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2648872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Set to true to allow the fragment's menu to be shown. 2658872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mMenuVisible = true; 2668872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2678872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Used to verify that subclasses call through to super class. 2688872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mCalled; 2698872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2708872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // If app has requested a specific animation, this is the one to use. 2718872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int mNextAnim; 2728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2738872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // The parent container of the fragment after dynamically added to UI. 2748872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger ViewGroup mContainer; 2758872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2768872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // The View generated for this fragment. 2778872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger View mView; 2788872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2798872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // The real inner view that will save/restore state. 2808872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger View mInnerView; 2818872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2828872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Whether this fragment should defer starting until after other fragments 2838872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // have been started and their loaders are finished. 2848872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mDeferStart; 2858872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2868872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Hint provided by the app that this fragment is currently visible to the user. 2878872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mUserVisibleHint = true; 2888872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2898872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger LoaderManagerImpl mLoaderManager; 290acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger boolean mLoadersStarted; 2918872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger boolean mCheckedForLoaderManager; 2928872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 2938872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 2948872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * State information that has been retrieved from a fragment instance 2958872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * through {@link FragmentManager#saveFragmentInstanceState(Fragment) 2968872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * FragmentManager.saveFragmentInstanceState}. 2978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 2988872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public static class SavedState implements Parcelable { 2998872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final Bundle mState; 3008872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3018872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger SavedState(Bundle state) { 3028872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mState = state; 3038872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3048872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3058872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger SavedState(Parcel in, ClassLoader loader) { 3068872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mState = in.readBundle(); 3078872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (loader != null && mState != null) { 3088872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mState.setClassLoader(loader); 3098872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3108872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3118872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3128872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger @Override 3138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public int describeContents() { 3148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return 0; 3158872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3168872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3178872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger @Override 3188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public void writeToParcel(Parcel dest, int flags) { 3198872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dest.writeBundle(mState); 3208872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3218872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3228872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public static final Parcelable.Creator<SavedState> CREATOR 3238872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger = new Parcelable.Creator<SavedState>() { 3248872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public SavedState createFromParcel(Parcel in) { 3258872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return new SavedState(in, null); 3268872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3278872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3288872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public SavedState[] newArray(int size) { 3298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return new SavedState[size]; 3308872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3318872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger }; 3328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3338872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3348872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 3358872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Thrown by {@link Fragment#instantiate(Context, String, Bundle)} when 3368872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * there is an instantiation failure. 3378872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 3388872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger static public class InstantiationException extends RuntimeException { 3398872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public InstantiationException(String msg, Exception cause) { 3408872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger super(msg, cause); 3418872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3428872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3438872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3448872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 3458872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Default constructor. <strong>Every</strong> fragment must have an 3468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * empty constructor, so it can be instantiated when restoring its 3478872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * activity's state. It is strongly recommended that subclasses do not 3488872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * have other constructors with parameters, since these constructors 3498872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * will not be called when the fragment is re-instantiated; instead, 3508872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * arguments can be supplied by the caller with {@link #setArguments} 3518872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * and later retrieved by the Fragment with {@link #getArguments}. 3528872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 3538872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * <p>Applications should generally not implement a constructor. The 3548872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * first place application code an run where the fragment is ready to 3558872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * be used is in {@link #onAttach(Activity)}, the point where the fragment 3568872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * is actually associated with its activity. Some applications may also 3578872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * want to implement {@link #onInflate} to retrieve attributes from a 3588872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * layout resource, though should take care here because this happens for 3598872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * the fragment is attached to its activity. 3608872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 3618872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public Fragment() { 3628872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3638872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3648872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 3658872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Like {@link #instantiate(Context, String, Bundle)} but with a null 3668872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * argument Bundle. 3678872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 3688872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public static Fragment instantiate(Context context, String fname) { 3698872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return instantiate(context, fname, null); 3708872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3718872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 3728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 3738872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Create a new instance of a Fragment with the given class name. This is 3748872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * the same as calling its empty constructor. 3758872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 3768872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param context The calling context being used to instantiate the fragment. 3778872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * This is currently just used to get its ClassLoader. 3788872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param fname The class name of the fragment to instantiate. 3798872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param args Bundle of arguments to supply to the fragment, which it 3808872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * can retrieve with {@link #getArguments()}. May be null. 3818872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @return Returns a new fragment instance. 3828872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @throws InstantiationException If there is a failure in instantiating 3838872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * the given fragment class. This is a runtime exception; it is not 3848872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * normally expected to happen. 3858872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 3868872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public static Fragment instantiate(Context context, String fname, Bundle args) { 3878872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger try { 3888872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger Class<?> clazz = sClassMap.get(fname); 3898872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (clazz == null) { 3908872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger // Class not found in the cache, see if it's real, and try to add it 3918872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger clazz = context.getClassLoader().loadClass(fname); 3928872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger sClassMap.put(fname, clazz); 3938872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3948872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger Fragment f = (Fragment)clazz.newInstance(); 3958872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (args != null) { 3968872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger args.setClassLoader(f.getClass().getClassLoader()); 3978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger f.mArguments = args; 3988872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 3998872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return f; 4008872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } catch (ClassNotFoundException e) { 4018872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new InstantiationException("Unable to instantiate fragment " + fname 4028872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger + ": make sure class name exists, is public, and has an" 4038872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger + " empty constructor that is public", e); 4048872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } catch (java.lang.InstantiationException e) { 4058872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new InstantiationException("Unable to instantiate fragment " + fname 4068872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger + ": make sure class name exists, is public, and has an" 4078872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger + " empty constructor that is public", e); 4088872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } catch (IllegalAccessException e) { 4098872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new InstantiationException("Unable to instantiate fragment " + fname 4108872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger + ": make sure class name exists, is public, and has an" 4118872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger + " empty constructor that is public", e); 4128872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4158872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final void restoreViewState(Bundle savedInstanceState) { 4168872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (mSavedViewState != null) { 4178872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mInnerView.restoreHierarchyState(mSavedViewState); 4188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mSavedViewState = null; 4198872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4208872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mCalled = false; 4218872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger onViewStateRestored(savedInstanceState); 4228872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (!mCalled) { 4238872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new SuperNotCalledException("Fragment " + this 4248872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger + " did not call through to super.onViewStateRestored()"); 4258872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4268872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4278872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4288872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final void setIndex(int index, Fragment parent) { 4298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mIndex = index; 4308872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (parent != null) { 4318872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mWho = parent.mWho + ":" + mIndex; 4328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } else { 4338872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mWho = "android:fragment:" + mIndex; 4348872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4358872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4368872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4378872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final boolean isInBackStack() { 4388872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mBackStackNesting > 0; 4398872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4408872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4418872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 4428872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Subclasses can not override equals(). 4438872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 4448872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger @Override final public boolean equals(Object o) { 4458872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return super.equals(o); 4468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4478872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4488872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 4498872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Subclasses can not override hashCode(). 4508872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 4518872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger @Override final public int hashCode() { 4528872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return super.hashCode(); 4538872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4548872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4558872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger @Override 4568872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public String toString() { 4578872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger StringBuilder sb = new StringBuilder(128); 4588872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger DebugUtils.buildShortClassTag(this, sb); 4598872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (mIndex >= 0) { 460acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger sb.append(" #"); 461acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger sb.append(mIndex); 462acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger } 463acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger if (mFragmentId != 0) { 4648872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger sb.append(" id=0x"); 4658872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger sb.append(Integer.toHexString(mFragmentId)); 4668872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4678872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (mTag != null) { 4688872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger sb.append(" "); 4698872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger sb.append(mTag); 4708872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4718872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger sb.append('}'); 4728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return sb.toString(); 4738872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4748872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4758872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 476acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * Return the identifier this fragment is known by. This is either 4778872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * the android:id value supplied in a layout or the container view ID 4788872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * supplied when adding the fragment. 4798872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 4808872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public int getId() { 4818872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mFragmentId; 4828872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4838872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 484acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger /** 4858872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Get the tag name of the fragment, if specified. 4868872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 4878872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public String getTag() { 4888872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mTag; 4898872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 4908872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 4918872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 4928872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Supply the construction arguments for this fragment. This can only 4938872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * be called before the fragment has been attached to its activity; that 4948872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * is, you should call it immediately after constructing the fragment. The 4958872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * arguments supplied here will be retained across fragment destroy and 4968872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * creation. 4978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 498acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger public void setArguments(Bundle args) { 4998872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (mIndex >= 0) { 5008872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new IllegalStateException("Fragment already active"); 5018872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 502acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger mArguments = args; 5038872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5048872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5058872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5068872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return the arguments supplied when the fragment was instantiated, 507acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * if any. 5088872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 5098872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public Bundle getArguments() { 5108872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mArguments; 511acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger } 5128872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Set the initial saved state that this Fragment should restore itself 5158872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * from when first being constructed, as returned by 516acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * {@link FragmentManager#saveFragmentInstanceState(Fragment) 5178872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * FragmentManager.saveFragmentInstanceState}. 5188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 5198872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param state The state the fragment should be restored from. 5208872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 5218872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public void setInitialSavedState(SavedState state) { 522acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger if (mIndex >= 0) { 5238872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new IllegalStateException("Fragment already active"); 5248872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5258872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mSavedFragmentState = state != null && state.mState != null 5268872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger ? state.mState : null; 527acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger } 5288872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5308872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Optional target for this fragment. This may be used, for example, 531acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * if this fragment is being started by another, and when done wants to 5328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * give a result back to the first. The target set here is retained 5338872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * across instances via {@link FragmentManager#putFragment 5348872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * FragmentManager.putFragment()}. 5358872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 5368872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param fragment The fragment that is the target of this one. 537acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * @param requestCode Optional request code, for convenience if you 5388872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * are going to call back with {@link #onActivityResult(int, int, Intent)}. 5398872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 5408872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public void setTargetFragment(Fragment fragment, int requestCode) { 5418872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mTarget = fragment; 542acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger mTargetRequestCode = requestCode; 5438872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5448872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5458872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return the target fragment set by {@link #setTargetFragment}. 5478872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 548acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger final public Fragment getTargetFragment() { 5498872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mTarget; 5508872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5518872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5528872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5538872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return the target request code set by {@link #setTargetFragment}. 5548872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 5558872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public int getTargetRequestCode() { 5568872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mTargetRequestCode; 5578872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5588872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5598872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5608872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return the Activity this fragment is currently associated with. 561acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger */ 5628872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public FragmentActivity getActivity() { 5638872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mActivity; 5648872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 565acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger 56670ffbf9e8288296ef7009c8297bcb6da6a7f73b2Mike Reed /** 56770ffbf9e8288296ef7009c8297bcb6da6a7f73b2Mike Reed * Return <code>getActivity().getResources()</code>. 56870ffbf9e8288296ef7009c8297bcb6da6a7f73b2Mike Reed */ 5698872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public Resources getResources() { 5708872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (mActivity == null) { 5718872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new IllegalStateException("Fragment " + this + " not attached to Activity"); 5728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 573acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger return mActivity.getResources(); 5748872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5758872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5768872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5778872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return a localized, styled CharSequence from the application's package's 5788872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * default string table. 5798872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 580acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * @param resId Resource id for the CharSequence text 5818872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 5828872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public final CharSequence getText(int resId) { 5838872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return getResources().getText(resId); 5848872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5858872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5868872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5878872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return a localized string from the application's package's 5888872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * default string table. 5898872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 5908872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param resId Resource id for the string 5918872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 5928872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public final String getString(int resId) { 5938872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return getResources().getString(resId); 5948872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 5958872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 5968872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 5978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return a localized formatted string from the application's package's 5988872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * default string table, substituting the format arguments as defined in 5998872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * {@link java.util.Formatter} and {@link java.lang.String#format}. 6008872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 6018872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param resId Resource id for the format string 6028872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * @param formatArgs The format arguments that will be used for substitution. 6038872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 6048872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6058872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger public final String getString(int resId, Object... formatArgs) { 6068872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return getResources().getString(resId, formatArgs); 6078872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6088872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6098872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 6108872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return the FragmentManager for interacting with fragments associated 6118872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * with this fragment's activity. Note that this will be non-null slightly 6128872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * before {@link #getActivity()}, during the time from when the fragment is 6138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * placed in a {@link FragmentTransaction} until it is committed and 6148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * attached to its activity. 6158872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * 6168872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * <p>If this Fragment is a child of another Fragment, the FragmentManager 6178872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * returned here will be the parent's {@link #getChildFragmentManager()}. 6188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 6198872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public FragmentManager getFragmentManager() { 6208872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mFragmentManager; 6218872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6228872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6238872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 6248872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return a private FragmentManager for placing and managing Fragments 6258872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * inside of this Fragment. 6268872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 6278872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public FragmentManager getChildFragmentManager() { 6288872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (mChildFragmentManager == null) { 6298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger instantiateChildFragmentManager(); 6308872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (mState >= RESUMED) { 6318872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mChildFragmentManager.dispatchResume(); 6328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } else if (mState >= STARTED) { 6338872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mChildFragmentManager.dispatchStart(); 6348872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } else if (mState >= ACTIVITY_CREATED) { 6358872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mChildFragmentManager.dispatchActivityCreated(); 6368872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } else if (mState >= CREATED) { 6378872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mChildFragmentManager.dispatchCreate(); 6388872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6398872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6408872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mChildFragmentManager; 6418872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6428872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6438872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 6448872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Returns the parent Fragment containing this Fragment. If this Fragment 6458872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * is attached directly to an Activity, returns null. 6468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 6478872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public Fragment getParentFragment() { 6488872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mParentFragment; 6498872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6508872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6518872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 6528872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return true if the fragment is currently added to its activity. 6538872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 6548872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public boolean isAdded() { 6558872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mActivity != null && mAdded; 6568872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6578872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6588872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 6598872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return true if the fragment has been explicitly detached from the UI. 6608872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * That is, {@link FragmentTransaction#detach(Fragment) 6618872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * FragmentTransaction.detach(Fragment)} has been used on it. 662acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger */ 6638872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public boolean isDetached() { 6648872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mDetached; 6658872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6668872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6678872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 6688872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return true if this fragment is currently being removed from its 6698872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * activity. This is <em>not</em> whether its activity is finishing, but 6708872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * rather whether it is in the process of being removed from its activity. 6718872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 6728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public boolean isRemoving() { 6738872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mRemoving; 6748872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6758872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 6768872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 6778872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return true if the layout is included as part of an activity view 6788872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * hierarchy via the <fragment> tag. This will always be true when 6798872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * fragments are created through the <fragment> tag, <em>except</em> 680acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * in the case where an old fragment is restored from a previous state and 681acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * it does not appear in the layout of the current state. 6828dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson */ 6838dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson final public boolean isInLayout() { 684acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger return mInLayout; 685acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger } 686acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger 687acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger /** 688acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger * Return true if the fragment is in the resumed state. This is true 6898872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * for the duration of {@link #onResume()} and {@link #onPause()} as well. 690acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger */ 691acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger final public boolean isResumed() { 6928872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mResumed; 6938872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 6948872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 695acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger /** 6968872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return true if the fragment is currently visible to the user. This means 6978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * it: (1) has been added, (2) has its view attached to the window, and 6988872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * (3) is not hidden. 6998872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger */ 7008872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger final public boolean isVisible() { 7018872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return isAdded() && !isHidden() && mView != null 7028872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE; 703acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger } 704acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger 7058872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger /** 7068872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * Return true if the fragment has been hidden. By default fragments 7078872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * are shown. You can find out about changes to this state with 7088872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * {@link #onHiddenChanged}. Note that the hidden state is orthogonal 7098872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * to other states -- that is, to be visible to the user, a fragment 7108872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger * must be both started and not hidden. 711acb4099deff72c2c631f7110a405a3331d3e8b27Derek Sollenberger */ 71234e79c1e570673148e3e0bbd91df3180a00eeff1Tom Hudson final public boolean isHidden() { 7138872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger return mHidden; 7148872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 7158872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 716 /** 717 * Called when the hidden state (as returned by {@link #isHidden()} of 718 * the fragment has changed. Fragments start out not hidden; this will 719 * be called whenever the fragment changes state from that. 720 * @param hidden True if the fragment is now hidden, false if it is not 721 * visible. 722 */ 723 public void onHiddenChanged(boolean hidden) { 724 } 725 726 /** 727 * Control whether a fragment instance is retained across Activity 728 * re-creation (such as from a configuration change). This can only 729 * be used with fragments not in the back stack. If set, the fragment 730 * lifecycle will be slightly different when an activity is recreated: 731 * <ul> 732 * <li> {@link #onDestroy()} will not be called (but {@link #onDetach()} still 733 * will be, because the fragment is being detached from its current activity). 734 * <li> {@link #onCreate(Bundle)} will not be called since the fragment 735 * is not being re-created. 736 * <li> {@link #onAttach(Activity)} and {@link #onActivityCreated(Bundle)} <b>will</b> 737 * still be called. 738 * </ul> 739 */ 740 public void setRetainInstance(boolean retain) { 741 if (retain && mParentFragment != null) { 742 throw new IllegalStateException( 743 "Can't retain fragements that are nested in other fragments"); 744 } 745 mRetainInstance = retain; 746 } 747 748 final public boolean getRetainInstance() { 749 return mRetainInstance; 750 } 751 752 /** 753 * Report that this fragment would like to participate in populating 754 * the options menu by receiving a call to {@link #onCreateOptionsMenu} 755 * and related methods. 756 * 757 * @param hasMenu If true, the fragment has menu items to contribute. 758 */ 759 public void setHasOptionsMenu(boolean hasMenu) { 760 if (mHasMenu != hasMenu) { 761 mHasMenu = hasMenu; 762 if (isAdded() && !isHidden()) { 763 mActivity.supportInvalidateOptionsMenu(); 764 } 765 } 766 } 767 768 /** 769 * Set a hint for whether this fragment's menu should be visible. This 770 * is useful if you know that a fragment has been placed in your view 771 * hierarchy so that the user can not currently seen it, so any menu items 772 * it has should also not be shown. 773 * 774 * @param menuVisible The default is true, meaning the fragment's menu will 775 * be shown as usual. If false, the user will not see the menu. 776 */ 777 public void setMenuVisibility(boolean menuVisible) { 778 if (mMenuVisible != menuVisible) { 779 mMenuVisible = menuVisible; 780 if (mHasMenu && isAdded() && !isHidden()) { 781 mActivity.supportInvalidateOptionsMenu(); 782 } 783 } 784 } 785 786 /** 787 * Set a hint to the system about whether this fragment's UI is currently visible 788 * to the user. This hint defaults to true and is persistent across fragment instance 789 * state save and restore. 790 * 791 * <p>An app may set this to false to indicate that the fragment's UI is 792 * scrolled out of visibility or is otherwise not directly visible to the user. 793 * This may be used by the system to prioritize operations such as fragment lifecycle updates 794 * or loader ordering behavior.</p> 795 * 796 * @param isVisibleToUser true if this fragment's UI is currently visible to the user (default), 797 * false if it is not. 798 */ 799 public void setUserVisibleHint(boolean isVisibleToUser) { 800 if (!mUserVisibleHint && isVisibleToUser && mState < STARTED) { 801 mFragmentManager.performPendingDeferredStart(this); 802 } 803 mUserVisibleHint = isVisibleToUser; 804 mDeferStart = !isVisibleToUser; 805 } 806 807 /** 808 * @return The current value of the user-visible hint on this fragment. 809 * @see #setUserVisibleHint(boolean) 810 */ 811 public boolean getUserVisibleHint() { 812 return mUserVisibleHint; 813 } 814 815 /** 816 * Return the LoaderManager for this fragment, creating it if needed. 817 */ 818 public LoaderManager getLoaderManager() { 819 if (mLoaderManager != null) { 820 return mLoaderManager; 821 } 822 if (mActivity == null) { 823 throw new IllegalStateException("Fragment " + this + " not attached to Activity"); 824 } 825 mCheckedForLoaderManager = true; 826 mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true); 827 return mLoaderManager; 828 } 829 830 /** 831 * Call {@link Activity#startActivity(Intent)} on the fragment's 832 * containing Activity. 833 */ 834 public void startActivity(Intent intent) { 835 if (mActivity == null) { 836 throw new IllegalStateException("Fragment " + this + " not attached to Activity"); 837 } 838 mActivity.startActivityFromFragment(this, intent, -1); 839 } 840 841 /** 842 * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's 843 * containing Activity. 844 */ 845 public void startActivityForResult(Intent intent, int requestCode) { 846 if (mActivity == null) { 847 throw new IllegalStateException("Fragment " + this + " not attached to Activity"); 848 } 849 mActivity.startActivityFromFragment(this, intent, requestCode); 850 } 851 852 /** 853 * Receive the result from a previous call to 854 * {@link #startActivityForResult(Intent, int)}. This follows the 855 * related Activity API as described there in 856 * {@link Activity#onActivityResult(int, int, Intent)}. 857 * 858 * @param requestCode The integer request code originally supplied to 859 * startActivityForResult(), allowing you to identify who this 860 * result came from. 861 * @param resultCode The integer result code returned by the child activity 862 * through its setResult(). 863 * @param data An Intent, which can return result data to the caller 864 * (various data can be attached to Intent "extras"). 865 */ 866 public void onActivityResult(int requestCode, int resultCode, Intent data) { 867 } 868 869 /** 870 * @hide Hack so that DialogFragment can make its Dialog before creating 871 * its views, and the view construction can use the dialog's context for 872 * inflation. Maybe this should become a public API. Note sure. 873 */ 874 public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { 875 return mActivity.getLayoutInflater(); 876 } 877 878 /** 879 * Called when a fragment is being created as part of a view layout 880 * inflation, typically from setting the content view of an activity. This 881 * may be called immediately after the fragment is created from a <fragment> 882 * tag in a layout file. Note this is <em>before</em> the fragment's 883 * {@link #onAttach(Activity)} has been called; all you should do here is 884 * parse the attributes and save them away. 885 * 886 * <p>This is called every time the fragment is inflated, even if it is 887 * being inflated into a new instance with saved state. It typically makes 888 * sense to re-parse the parameters each time, to allow them to change with 889 * different configurations.</p> 890 * 891 * <p>Here is a typical implementation of a fragment that can take parameters 892 * both through attributes supplied here as well from {@link #getArguments()}:</p> 893 * 894 * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java 895 * fragment} 896 * 897 * <p>Note that parsing the XML attributes uses a "styleable" resource. The 898 * declaration for the styleable used here is:</p> 899 * 900 * {@sample development/samples/ApiDemos/res/values/attrs.xml fragment_arguments} 901 * 902 * <p>The fragment can then be declared within its activity's content layout 903 * through a tag like this:</p> 904 * 905 * {@sample development/samples/ApiDemos/res/layout/fragment_arguments.xml from_attributes} 906 * 907 * <p>This fragment can also be created dynamically from arguments given 908 * at runtime in the arguments Bundle; here is an example of doing so at 909 * creation of the containing activity:</p> 910 * 911 * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java 912 * create} 913 * 914 * @param activity The Activity that is inflating this fragment. 915 * @param attrs The attributes at the tag where the fragment is 916 * being created. 917 * @param savedInstanceState If the fragment is being re-created from 918 * a previous saved state, this is the state. 919 */ 920 public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 921 mCalled = true; 922 } 923 924 /** 925 * Called when a fragment is first attached to its activity. 926 * {@link #onCreate(Bundle)} will be called after this. 927 */ 928 public void onAttach(Activity activity) { 929 mCalled = true; 930 } 931 932 /** 933 * Called when a fragment loads an animation. 934 */ 935 public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { 936 return null; 937 } 938 939 /** 940 * Called to do initial creation of a fragment. This is called after 941 * {@link #onAttach(Activity)} and before 942 * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. 943 * 944 * <p>Note that this can be called while the fragment's activity is 945 * still in the process of being created. As such, you can not rely 946 * on things like the activity's content view hierarchy being initialized 947 * at this point. If you want to do work once the activity itself is 948 * created, see {@link #onActivityCreated(Bundle)}. 949 * 950 * @param savedInstanceState If the fragment is being re-created from 951 * a previous saved state, this is the state. 952 */ 953 public void onCreate(Bundle savedInstanceState) { 954 mCalled = true; 955 } 956 957 /** 958 * Called to have the fragment instantiate its user interface view. 959 * This is optional, and non-graphical fragments can return null (which 960 * is the default implementation). This will be called between 961 * {@link #onCreate(Bundle)} and {@link #onActivityCreated(Bundle)}. 962 * 963 * <p>If you return a View from here, you will later be called in 964 * {@link #onDestroyView} when the view is being released. 965 * 966 * @param inflater The LayoutInflater object that can be used to inflate 967 * any views in the fragment, 968 * @param container If non-null, this is the parent view that the fragment's 969 * UI should be attached to. The fragment should not add the view itself, 970 * but this can be used to generate the LayoutParams of the view. 971 * @param savedInstanceState If non-null, this fragment is being re-constructed 972 * from a previous saved state as given here. 973 * 974 * @return Return the View for the fragment's UI, or null. 975 */ 976 public View onCreateView(LayoutInflater inflater, ViewGroup container, 977 Bundle savedInstanceState) { 978 return null; 979 } 980 981 /** 982 * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} 983 * has returned, but before any saved state has been restored in to the view. 984 * This gives subclasses a chance to initialize themselves once 985 * they know their view hierarchy has been completely created. The fragment's 986 * view hierarchy is not however attached to its parent at this point. 987 * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. 988 * @param savedInstanceState If non-null, this fragment is being re-constructed 989 * from a previous saved state as given here. 990 */ 991 public void onViewCreated(View view, Bundle savedInstanceState) { 992 } 993 994 /** 995 * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}), 996 * if provided. 997 * 998 * @return The fragment's root view, or null if it has no layout. 999 */ 1000 public View getView() { 1001 return mView; 1002 } 1003 1004 /** 1005 * Called when the fragment's activity has been created and this 1006 * fragment's view hierarchy instantiated. It can be used to do final 1007 * initialization once these pieces are in place, such as retrieving 1008 * views or restoring state. It is also useful for fragments that use 1009 * {@link #setRetainInstance(boolean)} to retain their instance, 1010 * as this callback tells the fragment when it is fully associated with 1011 * the new activity instance. This is called after {@link #onCreateView} 1012 * and before {@link #onViewStateRestored(Bundle)}. 1013 * 1014 * @param savedInstanceState If the fragment is being re-created from 1015 * a previous saved state, this is the state. 1016 */ 1017 public void onActivityCreated(Bundle savedInstanceState) { 1018 mCalled = true; 1019 } 1020 1021 /** 1022 * Called when all saved state has been restored into the view hierarchy 1023 * of the fragment. This can be used to do initialization based on saved 1024 * state that you are letting the view hierarchy track itself, such as 1025 * whether check box widgets are currently checked. This is called 1026 * after {@link #onActivityCreated(Bundle)} and before 1027 * {@link #onStart()}. 1028 * 1029 * @param savedInstanceState If the fragment is being re-created from 1030 * a previous saved state, this is the state. 1031 */ 1032 public void onViewStateRestored(Bundle savedInstanceState) { 1033 mCalled = true; 1034 } 1035 1036 /** 1037 * Called when the Fragment is visible to the user. This is generally 1038 * tied to {@link Activity#onStart() Activity.onStart} of the containing 1039 * Activity's lifecycle. 1040 */ 1041 public void onStart() { 1042 mCalled = true; 1043 1044 if (!mLoadersStarted) { 1045 mLoadersStarted = true; 1046 if (!mCheckedForLoaderManager) { 1047 mCheckedForLoaderManager = true; 1048 mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, false); 1049 } 1050 if (mLoaderManager != null) { 1051 mLoaderManager.doStart(); 1052 } 1053 } 1054 } 1055 1056 /** 1057 * Called when the fragment is visible to the user and actively running. 1058 * This is generally 1059 * tied to {@link Activity#onResume() Activity.onResume} of the containing 1060 * Activity's lifecycle. 1061 */ 1062 public void onResume() { 1063 mCalled = true; 1064 } 1065 1066 /** 1067 * Called to ask the fragment to save its current dynamic state, so it 1068 * can later be reconstructed in a new instance of its process is 1069 * restarted. If a new instance of the fragment later needs to be 1070 * created, the data you place in the Bundle here will be available 1071 * in the Bundle given to {@link #onCreate(Bundle)}, 1072 * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}, and 1073 * {@link #onActivityCreated(Bundle)}. 1074 * 1075 * <p>This corresponds to {@link Activity#onSaveInstanceState(Bundle) 1076 * Activity.onSaveInstanceState(Bundle)} and most of the discussion there 1077 * applies here as well. Note however: <em>this method may be called 1078 * at any time before {@link #onDestroy()}</em>. There are many situations 1079 * where a fragment may be mostly torn down (such as when placed on the 1080 * back stack with no UI showing), but its state will not be saved until 1081 * its owning activity actually needs to save its state. 1082 * 1083 * @param outState Bundle in which to place your saved state. 1084 */ 1085 public void onSaveInstanceState(Bundle outState) { 1086 } 1087 1088 public void onConfigurationChanged(Configuration newConfig) { 1089 mCalled = true; 1090 } 1091 1092 /** 1093 * Called when the Fragment is no longer resumed. This is generally 1094 * tied to {@link Activity#onPause() Activity.onPause} of the containing 1095 * Activity's lifecycle. 1096 */ 1097 public void onPause() { 1098 mCalled = true; 1099 } 1100 1101 /** 1102 * Called when the Fragment is no longer started. This is generally 1103 * tied to {@link Activity#onStop() Activity.onStop} of the containing 1104 * Activity's lifecycle. 1105 */ 1106 public void onStop() { 1107 mCalled = true; 1108 } 1109 1110 public void onLowMemory() { 1111 mCalled = true; 1112 } 1113 1114 /** 1115 * Called when the view previously created by {@link #onCreateView} has 1116 * been detached from the fragment. The next time the fragment needs 1117 * to be displayed, a new view will be created. This is called 1118 * after {@link #onStop()} and before {@link #onDestroy()}. It is called 1119 * <em>regardless</em> of whether {@link #onCreateView} returned a 1120 * non-null view. Internally it is called after the view's state has 1121 * been saved but before it has been removed from its parent. 1122 */ 1123 public void onDestroyView() { 1124 mCalled = true; 1125 } 1126 1127 /** 1128 * Called when the fragment is no longer in use. This is called 1129 * after {@link #onStop()} and before {@link #onDetach()}. 1130 */ 1131 public void onDestroy() { 1132 mCalled = true; 1133 //Log.v("foo", "onDestroy: mCheckedForLoaderManager=" + mCheckedForLoaderManager 1134 // + " mLoaderManager=" + mLoaderManager); 1135 if (!mCheckedForLoaderManager) { 1136 mCheckedForLoaderManager = true; 1137 mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, false); 1138 } 1139 if (mLoaderManager != null) { 1140 mLoaderManager.doDestroy(); 1141 } 1142 } 1143 1144 /** 1145 * Called by the fragment manager once this fragment has been removed, 1146 * so that we don't have any left-over state if the application decides 1147 * to re-use the instance. This only clears state that the framework 1148 * internally manages, not things the application sets. 1149 */ 1150 void initState() { 1151 mIndex = -1; 1152 mWho = null; 1153 mAdded = false; 1154 mRemoving = false; 1155 mResumed = false; 1156 mFromLayout = false; 1157 mInLayout = false; 1158 mRestored = false; 1159 mBackStackNesting = 0; 1160 mFragmentManager = null; 1161 mActivity = null; 1162 mFragmentId = 0; 1163 mContainerId = 0; 1164 mTag = null; 1165 mHidden = false; 1166 mDetached = false; 1167 mRetaining = false; 1168 mLoaderManager = null; 1169 mLoadersStarted = false; 1170 mCheckedForLoaderManager = false; 1171 } 1172 1173 /** 1174 * Called when the fragment is no longer attached to its activity. This 1175 * is called after {@link #onDestroy()}. 1176 */ 1177 public void onDetach() { 1178 mCalled = true; 1179 } 1180 1181 /** 1182 * Initialize the contents of the Activity's standard options menu. You 1183 * should place your menu items in to <var>menu</var>. For this method 1184 * to be called, you must have first called {@link #setHasOptionsMenu}. See 1185 * {@link Activity#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu} 1186 * for more information. 1187 * 1188 * @param menu The options menu in which you place your items. 1189 * 1190 * @see #setHasOptionsMenu 1191 * @see #onPrepareOptionsMenu 1192 * @see #onOptionsItemSelected 1193 */ 1194 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1195 } 1196 1197 /** 1198 * Prepare the Screen's standard options menu to be displayed. This is 1199 * called right before the menu is shown, every time it is shown. You can 1200 * use this method to efficiently enable/disable items or otherwise 1201 * dynamically modify the contents. See 1202 * {@link Activity#onPrepareOptionsMenu(Menu) Activity.onPrepareOptionsMenu} 1203 * for more information. 1204 * 1205 * @param menu The options menu as last shown or first initialized by 1206 * onCreateOptionsMenu(). 1207 * 1208 * @see #setHasOptionsMenu 1209 * @see #onCreateOptionsMenu 1210 */ 1211 public void onPrepareOptionsMenu(Menu menu) { 1212 } 1213 1214 /** 1215 * Called when this fragment's option menu items are no longer being 1216 * included in the overall options menu. Receiving this call means that 1217 * the menu needed to be rebuilt, but this fragment's items were not 1218 * included in the newly built menu (its {@link #onCreateOptionsMenu(Menu, MenuInflater)} 1219 * was not called). 1220 */ 1221 public void onDestroyOptionsMenu() { 1222 } 1223 1224 /** 1225 * This hook is called whenever an item in your options menu is selected. 1226 * The default implementation simply returns false to have the normal 1227 * processing happen (calling the item's Runnable or sending a message to 1228 * its Handler as appropriate). You can use this method for any items 1229 * for which you would like to do processing without those other 1230 * facilities. 1231 * 1232 * <p>Derived classes should call through to the base class for it to 1233 * perform the default menu handling. 1234 * 1235 * @param item The menu item that was selected. 1236 * 1237 * @return boolean Return false to allow normal menu processing to 1238 * proceed, true to consume it here. 1239 * 1240 * @see #onCreateOptionsMenu 1241 */ 1242 public boolean onOptionsItemSelected(MenuItem item) { 1243 return false; 1244 } 1245 1246 /** 1247 * This hook is called whenever the options menu is being closed (either by the user canceling 1248 * the menu with the back/menu button, or when an item is selected). 1249 * 1250 * @param menu The options menu as last shown or first initialized by 1251 * onCreateOptionsMenu(). 1252 */ 1253 public void onOptionsMenuClosed(Menu menu) { 1254 } 1255 1256 /** 1257 * Called when a context menu for the {@code view} is about to be shown. 1258 * Unlike {@link #onCreateOptionsMenu}, this will be called every 1259 * time the context menu is about to be shown and should be populated for 1260 * the view (or item inside the view for {@link AdapterView} subclasses, 1261 * this can be found in the {@code menuInfo})). 1262 * <p> 1263 * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an 1264 * item has been selected. 1265 * <p> 1266 * The default implementation calls up to 1267 * {@link Activity#onCreateContextMenu Activity.onCreateContextMenu}, though 1268 * you can not call this implementation if you don't want that behavior. 1269 * <p> 1270 * It is not safe to hold onto the context menu after this method returns. 1271 * {@inheritDoc} 1272 */ 1273 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 1274 getActivity().onCreateContextMenu(menu, v, menuInfo); 1275 } 1276 1277 /** 1278 * Registers a context menu to be shown for the given view (multiple views 1279 * can show the context menu). This method will set the 1280 * {@link OnCreateContextMenuListener} on the view to this fragment, so 1281 * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be 1282 * called when it is time to show the context menu. 1283 * 1284 * @see #unregisterForContextMenu(View) 1285 * @param view The view that should show a context menu. 1286 */ 1287 public void registerForContextMenu(View view) { 1288 view.setOnCreateContextMenuListener(this); 1289 } 1290 1291 /** 1292 * Prevents a context menu to be shown for the given view. This method will 1293 * remove the {@link OnCreateContextMenuListener} on the view. 1294 * 1295 * @see #registerForContextMenu(View) 1296 * @param view The view that should stop showing a context menu. 1297 */ 1298 public void unregisterForContextMenu(View view) { 1299 view.setOnCreateContextMenuListener(null); 1300 } 1301 1302 /** 1303 * This hook is called whenever an item in a context menu is selected. The 1304 * default implementation simply returns false to have the normal processing 1305 * happen (calling the item's Runnable or sending a message to its Handler 1306 * as appropriate). You can use this method for any items for which you 1307 * would like to do processing without those other facilities. 1308 * <p> 1309 * Use {@link MenuItem#getMenuInfo()} to get extra information set by the 1310 * View that added this menu item. 1311 * <p> 1312 * Derived classes should call through to the base class for it to perform 1313 * the default menu handling. 1314 * 1315 * @param item The context menu item that was selected. 1316 * @return boolean Return false to allow normal context menu processing to 1317 * proceed, true to consume it here. 1318 */ 1319 public boolean onContextItemSelected(MenuItem item) { 1320 return false; 1321 } 1322 1323 // SUPPORT MENU 1324 1325 /** 1326 * Initialize the contents of the Activity's standard options menu. You 1327 * should place your menu items in to <var>menu</var>. For this method 1328 * to be called, you must have first called {@link #setHasOptionsMenu}. See 1329 * {@link android.app.Activity#onCreateOptionsMenu(android.view.Menu) Activity.onCreateOptionsMenu} 1330 * for more information. 1331 * 1332 * @param menu The options menu in which you place your items. 1333 * 1334 * @see #setHasOptionsMenu 1335 * @see #onPrepareSupportOptionsMenu 1336 * @see #onSupportOptionsItemSelected 1337 */ 1338 public void onCreateSupportOptionsMenu(android.support.v4.view.Menu menu, 1339 android.support.v4.view.MenuInflater inflater) { 1340 } 1341 1342 /** 1343 * Prepare the Screen's standard options menu to be displayed. This is 1344 * called right before the menu is shown, every time it is shown. You can 1345 * use this method to efficiently enable/disable items or otherwise 1346 * dynamically modify the contents. See 1347 * {@link android.app.Activity#onPrepareOptionsMenu(android.view.Menu) Activity.onPrepareOptionsMenu} 1348 * for more information. 1349 * 1350 * @param menu The options menu as last shown or first initialized by 1351 * onCreateSupportOptionsMenu(). 1352 * 1353 * @see #setHasOptionsMenu 1354 * @see #onCreateSupportOptionsMenu 1355 */ 1356 public void onPrepareSupportOptionsMenu(android.support.v4.view.Menu menu) { 1357 } 1358 1359 /** 1360 * This hook is called whenever an item in your options menu is selected. 1361 * The default implementation simply returns false to have the normal 1362 * processing happen (calling the item's Runnable or sending a message to 1363 * its Handler as appropriate). You can use this method for any items 1364 * for which you would like to do processing without those other 1365 * facilities. 1366 * 1367 * <p>Derived classes should call through to the base class for it to 1368 * perform the default menu handling. 1369 * 1370 * @param item The menu item that was selected. 1371 * 1372 * @return boolean Return false to allow normal menu processing to 1373 * proceed, true to consume it here. 1374 * 1375 * @see #onCreateSupportOptionsMenu 1376 */ 1377 public boolean onSupportOptionsItemSelected(android.support.v4.view.MenuItem item) { 1378 return false; 1379 } 1380 1381 // END SUPPORT MENU 1382 1383 /** 1384 * Print the Fragments's state into the given stream. 1385 * 1386 * @param prefix Text to print at the front of each line. 1387 * @param fd The raw file descriptor that the dump is being sent to. 1388 * @param writer The PrintWriter to which you should dump your state. This will be 1389 * closed for you after you return. 1390 * @param args additional arguments to the dump request. 1391 */ 1392 public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 1393 writer.print(prefix); writer.print("mFragmentId=#"); 1394 writer.print(Integer.toHexString(mFragmentId)); 1395 writer.print(" mContainerId=#"); 1396 writer.print(Integer.toHexString(mContainerId)); 1397 writer.print(" mTag="); writer.println(mTag); 1398 writer.print(prefix); writer.print("mState="); writer.print(mState); 1399 writer.print(" mIndex="); writer.print(mIndex); 1400 writer.print(" mWho="); writer.print(mWho); 1401 writer.print(" mBackStackNesting="); writer.println(mBackStackNesting); 1402 writer.print(prefix); writer.print("mAdded="); writer.print(mAdded); 1403 writer.print(" mRemoving="); writer.print(mRemoving); 1404 writer.print(" mResumed="); writer.print(mResumed); 1405 writer.print(" mFromLayout="); writer.print(mFromLayout); 1406 writer.print(" mInLayout="); writer.println(mInLayout); 1407 writer.print(prefix); writer.print("mHidden="); writer.print(mHidden); 1408 writer.print(" mDetached="); writer.print(mDetached); 1409 writer.print(" mMenuVisible="); writer.print(mMenuVisible); 1410 writer.print(" mHasMenu="); writer.println(mHasMenu); 1411 writer.print(prefix); writer.print("mRetainInstance="); writer.print(mRetainInstance); 1412 writer.print(" mRetaining="); writer.print(mRetaining); 1413 writer.print(" mUserVisibleHint="); writer.println(mUserVisibleHint); 1414 if (mFragmentManager != null) { 1415 writer.print(prefix); writer.print("mFragmentManager="); 1416 writer.println(mFragmentManager); 1417 } 1418 if (mActivity != null) { 1419 writer.print(prefix); writer.print("mActivity="); 1420 writer.println(mActivity); 1421 } 1422 if (mParentFragment != null) { 1423 writer.print(prefix); writer.print("mParentFragment="); 1424 writer.println(mParentFragment); 1425 } 1426 if (mArguments != null) { 1427 writer.print(prefix); writer.print("mArguments="); writer.println(mArguments); 1428 } 1429 if (mSavedFragmentState != null) { 1430 writer.print(prefix); writer.print("mSavedFragmentState="); 1431 writer.println(mSavedFragmentState); 1432 } 1433 if (mSavedViewState != null) { 1434 writer.print(prefix); writer.print("mSavedViewState="); 1435 writer.println(mSavedViewState); 1436 } 1437 if (mTarget != null) { 1438 writer.print(prefix); writer.print("mTarget="); writer.print(mTarget); 1439 writer.print(" mTargetRequestCode="); 1440 writer.println(mTargetRequestCode); 1441 } 1442 if (mNextAnim != 0) { 1443 writer.print(prefix); writer.print("mNextAnim="); writer.println(mNextAnim); 1444 } 1445 if (mContainer != null) { 1446 writer.print(prefix); writer.print("mContainer="); writer.println(mContainer); 1447 } 1448 if (mView != null) { 1449 writer.print(prefix); writer.print("mView="); writer.println(mView); 1450 } 1451 if (mInnerView != null) { 1452 writer.print(prefix); writer.print("mInnerView="); writer.println(mView); 1453 } 1454 if (mAnimatingAway != null) { 1455 writer.print(prefix); writer.print("mAnimatingAway="); writer.println(mAnimatingAway); 1456 writer.print(prefix); writer.print("mStateAfterAnimating="); 1457 writer.println(mStateAfterAnimating); 1458 } 1459 if (mLoaderManager != null) { 1460 writer.print(prefix); writer.println("Loader Manager:"); 1461 mLoaderManager.dump(prefix + " ", fd, writer, args); 1462 } 1463 if (mChildFragmentManager != null) { 1464 writer.print(prefix); writer.println("Child " + mChildFragmentManager + ":"); 1465 mChildFragmentManager.dump(prefix + " ", fd, writer, args); 1466 } 1467 } 1468 1469 Fragment findFragmentByWho(String who) { 1470 if (who.equals(mWho)) { 1471 return this; 1472 } 1473 if (mChildFragmentManager != null) { 1474 return mChildFragmentManager.findFragmentByWho(who); 1475 } 1476 return null; 1477 } 1478 1479 void instantiateChildFragmentManager() { 1480 mChildFragmentManager = new FragmentManagerImpl(); 1481 mChildFragmentManager.attachActivity(mActivity, new FragmentContainer() { 1482 @Override 1483 public View findViewById(int id) { 1484 if (mView == null) { 1485 throw new IllegalStateException("Fragment does not have a view"); 1486 } 1487 return mView.findViewById(id); 1488 } 1489 }, this); 1490 } 1491 1492 void performCreate(Bundle savedInstanceState) { 1493 if (mChildFragmentManager != null) { 1494 mChildFragmentManager.noteStateNotSaved(); 1495 } 1496 mCalled = false; 1497 onCreate(savedInstanceState); 1498 if (!mCalled) { 1499 throw new SuperNotCalledException("Fragment " + this 1500 + " did not call through to super.onCreate()"); 1501 } 1502 if (savedInstanceState != null) { 1503 Parcelable p = savedInstanceState.getParcelable( 1504 FragmentActivity.FRAGMENTS_TAG); 1505 if (p != null) { 1506 if (mChildFragmentManager == null) { 1507 instantiateChildFragmentManager(); 1508 } 1509 mChildFragmentManager.restoreAllState(p, null); 1510 mChildFragmentManager.dispatchCreate(); 1511 } 1512 } 1513 } 1514 1515 View performCreateView(LayoutInflater inflater, ViewGroup container, 1516 Bundle savedInstanceState) { 1517 if (mChildFragmentManager != null) { 1518 mChildFragmentManager.noteStateNotSaved(); 1519 } 1520 return onCreateView(inflater, container, savedInstanceState); 1521 } 1522 1523 void performActivityCreated(Bundle savedInstanceState) { 1524 if (mChildFragmentManager != null) { 1525 mChildFragmentManager.noteStateNotSaved(); 1526 } 1527 mCalled = false; 1528 onActivityCreated(savedInstanceState); 1529 if (!mCalled) { 1530 throw new SuperNotCalledException("Fragment " + this 1531 + " did not call through to super.onActivityCreated()"); 1532 } 1533 if (mChildFragmentManager != null) { 1534 mChildFragmentManager.dispatchActivityCreated(); 1535 } 1536 } 1537 1538 void performStart() { 1539 if (mChildFragmentManager != null) { 1540 mChildFragmentManager.noteStateNotSaved(); 1541 mChildFragmentManager.execPendingActions(); 1542 } 1543 mCalled = false; 1544 onStart(); 1545 if (!mCalled) { 1546 throw new SuperNotCalledException("Fragment " + this 1547 + " did not call through to super.onStart()"); 1548 } 1549 if (mChildFragmentManager != null) { 1550 mChildFragmentManager.dispatchStart(); 1551 } 1552 if (mLoaderManager != null) { 1553 mLoaderManager.doReportStart(); 1554 } 1555 } 1556 1557 void performResume() { 1558 if (mChildFragmentManager != null) { 1559 mChildFragmentManager.noteStateNotSaved(); 1560 mChildFragmentManager.execPendingActions(); 1561 } 1562 mCalled = false; 1563 onResume(); 1564 if (!mCalled) { 1565 throw new SuperNotCalledException("Fragment " + this 1566 + " did not call through to super.onResume()"); 1567 } 1568 if (mChildFragmentManager != null) { 1569 mChildFragmentManager.dispatchResume(); 1570 mChildFragmentManager.execPendingActions(); 1571 } 1572 } 1573 1574 void performConfigurationChanged(Configuration newConfig) { 1575 onConfigurationChanged(newConfig); 1576 if (mChildFragmentManager != null) { 1577 mChildFragmentManager.dispatchConfigurationChanged(newConfig); 1578 } 1579 } 1580 1581 void performLowMemory() { 1582 onLowMemory(); 1583 if (mChildFragmentManager != null) { 1584 mChildFragmentManager.dispatchLowMemory(); 1585 } 1586 } 1587 1588 /* 1589 void performTrimMemory(int level) { 1590 onTrimMemory(level); 1591 if (mChildFragmentManager != null) { 1592 mChildFragmentManager.dispatchTrimMemory(level); 1593 } 1594 } 1595 */ 1596 1597 boolean performCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1598 boolean show = false; 1599 if (!mHidden) { 1600 if (mHasMenu && mMenuVisible) { 1601 show = true; 1602 onCreateOptionsMenu(menu, inflater); 1603 } 1604 if (mChildFragmentManager != null) { 1605 show |= mChildFragmentManager.dispatchCreateOptionsMenu(menu, inflater); 1606 } 1607 } 1608 return show; 1609 } 1610 1611 boolean performPrepareOptionsMenu(Menu menu) { 1612 boolean show = false; 1613 if (!mHidden) { 1614 if (mHasMenu && mMenuVisible) { 1615 show = true; 1616 onPrepareOptionsMenu(menu); 1617 } 1618 if (mChildFragmentManager != null) { 1619 show |= mChildFragmentManager.dispatchPrepareOptionsMenu(menu); 1620 } 1621 } 1622 return show; 1623 } 1624 1625 boolean performOptionsItemSelected(MenuItem item) { 1626 if (!mHidden) { 1627 if (mHasMenu && mMenuVisible) { 1628 if (onOptionsItemSelected(item)) { 1629 return true; 1630 } 1631 } 1632 if (mChildFragmentManager != null) { 1633 if (mChildFragmentManager.dispatchOptionsItemSelected(item)) { 1634 return true; 1635 } 1636 } 1637 } 1638 return false; 1639 } 1640 1641 boolean performContextItemSelected(MenuItem item) { 1642 if (!mHidden) { 1643 if (onContextItemSelected(item)) { 1644 return true; 1645 } 1646 if (mChildFragmentManager != null) { 1647 if (mChildFragmentManager.dispatchContextItemSelected(item)) { 1648 return true; 1649 } 1650 } 1651 } 1652 return false; 1653 } 1654 1655 void performOptionsMenuClosed(Menu menu) { 1656 if (!mHidden) { 1657 if (mHasMenu && mMenuVisible) { 1658 onOptionsMenuClosed(menu); 1659 } 1660 if (mChildFragmentManager != null) { 1661 mChildFragmentManager.dispatchOptionsMenuClosed(menu); 1662 } 1663 } 1664 } 1665 1666 boolean performCreateSupportOptionsMenu(android.support.v4.view.Menu menu, 1667 android.support.v4.view.MenuInflater inflater) { 1668 boolean show = false; 1669 if (!mHidden) { 1670 if (mHasMenu && mMenuVisible) { 1671 show = true; 1672 onCreateSupportOptionsMenu(menu, inflater); 1673 } 1674 1675 if (mChildFragmentManager != null) { 1676 show |= mChildFragmentManager.dispatchCreateSupportOptionsMenu(menu, inflater); 1677 } 1678 } 1679 return show; 1680 } 1681 1682 boolean performPrepareSupportOptionsMenu(android.support.v4.view.Menu menu) { 1683 boolean show = false; 1684 if (!mHidden) { 1685 if (mHasMenu && mMenuVisible) { 1686 show = true; 1687 onPrepareSupportOptionsMenu(menu); 1688 } 1689 1690 if (mChildFragmentManager != null) { 1691 show |= mChildFragmentManager.dispatchPrepareSupportOptionsMenu(menu); 1692 } 1693 } 1694 return show; 1695 } 1696 1697 boolean performSupportOptionsItemSelected(android.support.v4.view.MenuItem item) { 1698 if (!mHidden) { 1699 if (mHasMenu && mMenuVisible) { 1700 if (onSupportOptionsItemSelected(item)) { 1701 return true; 1702 } 1703 } 1704 1705 if (mChildFragmentManager != null) { 1706 if (mChildFragmentManager.dispatchSupportOptionsItemSelected(item)) { 1707 return true; 1708 } 1709 } 1710 } 1711 return false; 1712 } 1713 1714 void performSaveInstanceState(Bundle outState) { 1715 onSaveInstanceState(outState); 1716 if (mChildFragmentManager != null) { 1717 Parcelable p = mChildFragmentManager.saveAllState(); 1718 if (p != null) { 1719 outState.putParcelable(FragmentActivity.FRAGMENTS_TAG, p); 1720 } 1721 } 1722 } 1723 1724 void performPause() { 1725 if (mChildFragmentManager != null) { 1726 mChildFragmentManager.dispatchPause(); 1727 } 1728 mCalled = false; 1729 onPause(); 1730 if (!mCalled) { 1731 throw new SuperNotCalledException("Fragment " + this 1732 + " did not call through to super.onPause()"); 1733 } 1734 } 1735 1736 void performStop() { 1737 if (mChildFragmentManager != null) { 1738 mChildFragmentManager.dispatchStop(); 1739 } 1740 mCalled = false; 1741 onStop(); 1742 if (!mCalled) { 1743 throw new SuperNotCalledException("Fragment " + this 1744 + " did not call through to super.onStop()"); 1745 } 1746 } 1747 1748 void performReallyStop() { 1749 if (mChildFragmentManager != null) { 1750 mChildFragmentManager.dispatchReallyStop(); 1751 } 1752 if (mLoadersStarted) { 1753 mLoadersStarted = false; 1754 if (!mCheckedForLoaderManager) { 1755 mCheckedForLoaderManager = true; 1756 mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, false); 1757 } 1758 if (mLoaderManager != null) { 1759 if (!mActivity.mRetaining) { 1760 mLoaderManager.doStop(); 1761 } else { 1762 mLoaderManager.doRetain(); 1763 } 1764 } 1765 } 1766 } 1767 1768 void performDestroyView() { 1769 if (mChildFragmentManager != null) { 1770 mChildFragmentManager.dispatchDestroyView(); 1771 } 1772 mCalled = false; 1773 onDestroyView(); 1774 if (!mCalled) { 1775 throw new SuperNotCalledException("Fragment " + this 1776 + " did not call through to super.onDestroyView()"); 1777 } 1778 if (mLoaderManager != null) { 1779 mLoaderManager.doReportNextStart(); 1780 } 1781 } 1782 1783 void performDestroy() { 1784 if (mChildFragmentManager != null) { 1785 mChildFragmentManager.dispatchDestroy(); 1786 } 1787 mCalled = false; 1788 onDestroy(); 1789 if (!mCalled) { 1790 throw new SuperNotCalledException("Fragment " + this 1791 + " did not call through to super.onDestroy()"); 1792 } 1793 } 1794} 1795