FragmentManager.java revision 2dedce6e84679ead961a485c7fe4b0f77c713b6a
12dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/* 22dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 32dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 42dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 52dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * you may not use this file except in compliance with the License. 62dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * You may obtain a copy of the License at 72dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 82dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 92dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Unless required by applicable law or agreed to in writing, software 112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * See the License for the specific language governing permissions and 142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * limitations under the License. 152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornpackage android.app; 182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle; 202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup; 212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList; 232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/** 252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity. 262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornclass FragmentManager { 282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn final ArrayList<Fragment> mFragments = new ArrayList<Fragment>(); 292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn int mCurState = Fragment.INITIALIZING; 312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn Activity mActivity; 322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn void moveToState(Fragment f, int newState) { 342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mState < newState) { 352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.INITIALIZING: 372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = mActivity; 382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onAttach(mActivity); 402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onAttach()"); 432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onCreate(null); 462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onCreate()"); 492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn ViewGroup container = null; 522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mContainerId != 0) { 532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn container = (ViewGroup)mActivity.findViewById(f.mContainerId); 542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (container == null) { 552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new IllegalArgumentException("New view found for id 0x" 562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + Integer.toHexString(f.mContainerId) 572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " for fragment " + f); 582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer = container; 612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), container); 622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (container != null && f.mView != null) { 632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn container.addView(f.mView); 642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.CREATED: 672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState > Fragment.CREATED) { 682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onStart(); 702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStart()"); 732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState > Fragment.STARTED) { 772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onResume(); 792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onResume()"); 822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } else if (f.mState > newState) { 862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.RESUMED: 882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.RESUMED) { 892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onPause(); 912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onPause()"); 942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.STARTED) { 982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onStop(); 1002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 1012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 1022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStop()"); 1032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.CREATED: 1062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.CREATED) { 1072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mContainer != null && f.mView != null) { 1082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer.removeView(f.mView); 1092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer = null; 1112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mView = null; 1122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 1142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onDestroy(); 1152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 1162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 1172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onDestroy()"); 1182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 1202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onDetach(); 1212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 1222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 1232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onDetach()"); 1242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = null; 1262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mState = newState; 1312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn void moveToState(int newState) { 1342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity == null && newState != Fragment.INITIALIZING) { 1352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new IllegalStateException("No activity"); 1362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mCurState = newState; 1392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn for (int i=0; i<mFragments.size(); i++) { 1402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn Fragment f = mFragments.get(i); 1412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(f, newState); 1422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void addFragment(Fragment fragment) { 1462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mFragments.add(fragment); 1472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void removeFragment(Fragment fragment) { 1502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mFragments.remove(fragment); 1512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(fragment, Fragment.INITIALIZING); 1522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 1552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 1562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 1572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchCreate(Bundle state) { 1602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(Fragment.CREATED); 1612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 1642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(Fragment.STARTED); 1652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 1682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(Fragment.RESUMED); 1692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 1722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(Fragment.STARTED); 1732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 1762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(Fragment.CREATED); 1772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 1802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn moveToState(Fragment.INITIALIZING); 1812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 1822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 184