1 page.title=Fragments 2 parent.title=Activities 3 parent.link=activities.html 4 @jd:body 5 6 <div id="qv-wrapper"> 7 <div id="qv"> 8 9 <h2>Quickview</h2> 10 <ul> 11 <li>Fragments decompose application functionality and UI into reusable modules</li> 12 <li>Add multiple fragments to a screen to avoid switching activities</li> 13 <li>Fragments have their own lifecycle, state, and back stack</li> 14 <li>Fragments require API Level 11 or greater</li> 15 </ul> 16 17 <h2>In this document</h2> 18 <ol> 19 <li><a href="#Design">Design Philosophy</a></li> 20 <li><a href="#Creating">Creating a Fragment</a> 21 <ol> 22 <li><a href="#UI">Adding a user interface</a></li> 23 <li><a href="#Adding">Adding a fragment to an activity</a></li> 24 </ol> 25 </li> 26 <li><a href="#Managing">Managing Fragments</a></li> 27 <li><a href="#Transactions">Performing Fragment Transactions</a></li> 28 <li><a href="#CommunicatingWithActivity">Communicating with the Activity</a> 29 <ol> 30 <li><a href="#EventCallbacks">Creating event callbacks to the activity</a></li> 31 <li><a href="#ActionBar">Adding items to the Action Bar</a></li> 32 </ol> 33 </li> 34 <li><a href="#Lifecycle">Handling the Fragment Lifecycle</a> 35 <ol> 36 <li><a href="#CoordinatingWithActivity">Coordinating with the activity lifecycle</a></li> 37 </ol> 38 </li> 39 <li><a href="#Example">Example</a></li> 40 </ol> 41 42 <h2>Key classes</h2> 43 <ol> 44 <li>{@link android.app.Fragment}</li> 45 <li>{@link android.app.FragmentManager}</li> 46 <li>{@link android.app.FragmentTransaction}</li> 47 </ol> 48 49 <h2>See also</h2> 50 <ol> 51 <li><a href="{@docRoot}training/basics/fragments/index.html">Building a Dynamic UI with Fragments</a></li> 52 <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">Supporting Tablets 53 and Handsets</a></li> 54 </ol> 55 </div> 56 </div> 57 58 <p>A {@link android.app.Fragment} represents a behavior or a portion of user interface in an 59 {@link android.app.Activity}. You can combine multiple fragments in a single activity to build a 60 multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a 61 modular section of an activity, which has its own lifecycle, receives its own input events, and 62 which you can add or remove while the activity is running (sort of like a "sub activity" that 63 you can reuse in different activities).</p> 64 65 <p>A fragment must always be embedded in an activity and the fragment's lifecycle is directly 66 affected by the host activity's lifecycle. For example, when the activity is paused, so are all 67 fragments in it, and when the activity is destroyed, so are all fragments. However, while an 68 activity is running (it is in the <em>resumed</em> <a 69 href="{@docRoot}guide/components/activities.html#Lifecycle">lifecycle state</a>), you can 70 manipulate each fragment independently, such as add or remove them. When you perform such a 71 fragment transaction, you can also add it to a back stack that's managed by the 72 activity—each back stack entry in the activity is a record of the fragment transaction that 73 occurred. The back stack allows the user to reverse a fragment transaction (navigate backwards), 74 by pressing the <em>Back</em> button.</p> 75 76 <p>When you add a fragment as a part of your activity layout, it lives in a {@link 77 android.view.ViewGroup} inside the activity's view hierarchy and the fragment defines its own view 78 layout. 79 You can insert a fragment into your activity layout by declaring the fragment in the activity's 80 layout file, as a {@code <fragment>} element, or from your application code by adding it to an 81 existing {@link android.view.ViewGroup}. However, a fragment is not required to be a part of the 82 activity layout; you may also use a fragment without its own UI as an invisible worker for the 83 activity.</p> 84 85 <p>This document describes how to build your application to use fragments, including 86 how fragments can maintain their state when added to the activity's back stack, share 87 events with the activity and other fragments in the activity, contribute to the activity's action 88 bar, and more.</p> 89 90 91 <h2 id="Design">Design Philosophy</h2> 92 93 <p>Android introduced fragments in Android 3.0 (API level 11), primarily to support more 94 dynamic and flexible UI designs on large screens, such as tablets. Because a 95 tablet's screen is much larger than that of a handset, there's more room to combine and 96 interchange UI components. Fragments allow such designs without the need for you to manage complex 97 changes to the view hierarchy. By dividing the layout of an activity into fragments, you become able 98 to modify the activity's appearance at runtime and preserve those changes in a back stack 99 that's managed by the activity.</p> 100 101 <p>For example, a news application can use one fragment to show a list of articles on the 102 left and another fragment to display an article on the right—both fragments appear in one 103 activity, side by side, and each fragment has its own set of lifecycle callback methods and handle 104 their own user input events. Thus, instead of using one activity to select an article and another 105 activity to read the article, the user can select an article and read it all within the same 106 activity, as illustrated in the tablet layout in figure 1.</p> 107 108 <p>You should design each fragment as a modular and reusable activity component. That is, because 109 each fragment defines its own layout and its own behavior with its own lifecycle callbacks, you can 110 include one fragment in multiple activities, so you should design for reuse and avoid directly 111 manipulating one fragment from another fragment. This is especially important because a modular 112 fragment allows you to change your fragment combinations for different screen sizes. When designing 113 your application to support both tablets and handsets, you can reuse your fragments in different 114 layout configurations to optimize the user experience based on the available screen space. For 115 example, on a handset, it might be necessary to separate fragments to provide a single-pane UI when 116 more than one cannot fit within the same activity.</p> 117 118 <img src="{@docRoot}images/fundamentals/fragments.png" alt="" /> 119 <p class="img-caption"><strong>Figure 1.</strong> An example of how two UI modules defined by 120 fragments can be combined into one activity for a tablet design, but separated for a 121 handset design.</p> 122 123 <p>For example—to continue with the news application example—the application can embed 124 two fragments in <em>Activity A</em>, when running on a tablet-sized device. However, on a 125 handset-sized screen, there's not enough room for both fragments, so <em>Activity A</em> includes 126 only the fragment for the list of articles, and when the user selects an article, it starts 127 <em>Activity B</em>, which includes the second fragment to read the article. Thus, the application 128 supports both tablets and handsets by reusing fragments in different combinations, as illustrated in 129 figure 1.</p> 130 131 <p>For more information about designing your application with different fragment combinations for 132 different screen configurations, see the guide to <a 133 href="{@docRoot}guide/practices/tablets-and-handsets.html">Supporting Tablets and Handsets</a>.</p> 134 135 136 137 <h2 id="Creating">Creating a Fragment</h2> 138 139 <div class="figure" style="width:327px"> 140 <img src="{@docRoot}images/fragment_lifecycle.png" alt="" /> 141 <p class="img-caption"><strong>Figure 2.</strong> The lifecycle of a fragment (while its 142 activity is running).</p> 143 </div> 144 145 <p>To create a fragment, you must create a subclass of {@link android.app.Fragment} (or an existing 146 subclass of it). The {@link android.app.Fragment} class has code that looks a lot like 147 an {@link android.app.Activity}. It contains callback methods similar to an activity, such 148 as {@link android.app.Fragment#onCreate onCreate()}, {@link android.app.Fragment#onStart onStart()}, 149 {@link android.app.Fragment#onPause onPause()}, and {@link android.app.Fragment#onStop onStop()}. In 150 fact, if you're converting an existing Android application to use fragments, you might simply move 151 code from your activity's callback methods into the respective callback methods of your 152 fragment.</p> 153 154 <p>Usually, you should implement at least the following lifecycle methods:</p> 155 156 <dl> 157 <dt>{@link android.app.Fragment#onCreate onCreate()}</dt> 158 <dd>The system calls this when creating the fragment. Within your implementation, you should 159 initialize essential components of the fragment that you want to retain when the fragment is 160 paused or stopped, then resumed.</dd> 161 <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt> 162 <dd>The system calls this when it's time for the fragment to draw its user interface for the 163 first time. To draw a UI for your fragment, you must return a {@link android.view.View} from this 164 method that is the root of your fragment's layout. You can return null if the fragment does not 165 provide a UI.</dd> 166 <dt>{@link android.app.Activity#onPause onPause()}</dt> 167 <dd>The system calls this method as the first indication that the user is leaving the 168 fragment (though it does not always mean the fragment is being destroyed). This is usually where you 169 should commit any changes that should be persisted beyond the current user session (because 170 the user might not come back).</dd> 171 </dl> 172 173 <p>Most applications should implement at least these three methods for every fragment, but there are 174 several other callback methods you should also use to handle various stages of the 175 fragment lifecycle. All the lifecycle callback methods are discussed in more detail in the section 176 about <a href="#Lifecycle">Handling the Fragment Lifecycle</a>.</p> 177 178 179 <p>There are also a few subclasses that you might want to extend, instead of the base {@link 180 android.app.Fragment} class:</p> 181 182 <dl> 183 <dt>{@link android.app.DialogFragment}</dt> 184 <dd>Displays a floating dialog. Using this class to create a dialog is a good alternative to using 185 the dialog helper methods in the {@link android.app.Activity} class, because you can 186 incorporate a fragment dialog into the back stack of fragments managed by the activity, 187 allowing the user to return to a dismissed fragment.</dd> 188 189 <dt>{@link android.app.ListFragment}</dt> 190 <dd>Displays a list of items that are managed by an adapter (such as a {@link 191 android.widget.SimpleCursorAdapter}), similar to {@link android.app.ListActivity}. It provides 192 several methods for managing a list view, such as the {@link 193 android.app.ListFragment#onListItemClick(ListView,View,int,long) onListItemClick()} callback to 194 handle click events.</dd> 195 196 <dt>{@link android.preference.PreferenceFragment}</dt> 197 <dd>Displays a hierarchy of {@link android.preference.Preference} objects as a list, similar to 198 {@link android.preference.PreferenceActivity}. This is useful when creating a "settings" 199 activity for your application.</dd> 200 </dl> 201 202 203 <h3 id="UI">Adding a user interface</h3> 204 205 <p>A fragment is usually used as part of an activity's user interface and contributes its own 206 layout to the activity.</p> 207 208 <p>To provide a layout for a fragment, you must implement the {@link 209 android.app.Fragment#onCreateView onCreateView()} callback method, which the Android system calls 210 when it's time for the fragment to draw its layout. Your implementation of this method must return a 211 {@link android.view.View} that is the root of your fragment's layout.</p> 212 213 <p class="note"><strong>Note:</strong> If your fragment is a subclass of {@link 214 android.app.ListFragment}, the default implementation returns a {@link android.widget.ListView} from 215 {@link android.app.Fragment#onCreateView onCreateView()}, so you don't need to implement it.</p> 216 217 <p>To return a layout from {@link 218 android.app.Fragment#onCreateView onCreateView()}, you can inflate it from a <a 219 href="{@docRoot}guide/topics/resources/layout-resource.html">layout resource</a> defined in XML. To 220 help you do so, {@link android.app.Fragment#onCreateView onCreateView()} provides a 221 {@link android.view.LayoutInflater} object.</p> 222 223 <p>For example, here's a subclass of {@link android.app.Fragment} that loads a layout from the 224 {@code example_fragment.xml} file:</p> 225 226 <pre> 227 public static class ExampleFragment extends Fragment { 228 @Override 229 public View onCreateView(LayoutInflater inflater, ViewGroup container, 230 Bundle savedInstanceState) { 231 // Inflate the layout for this fragment 232 return inflater.inflate(R.layout.example_fragment, container, false); 233 } 234 } 235 </pre> 236 237 <div class="sidebox-wrapper"> 238 <div class="sidebox"> 239 <h3>Creating a layout</h3> 240 <p>In the sample above, {@code R.layout.example_fragment} is a reference to a layout resource 241 named {@code example_fragment.xml} saved in the application resources. For information about how to 242 create a layout in XML, see the <a href="{@docRoot}guide/topics/ui/index.html">User Interface</a> 243 documentation.</p> 244 </div> 245 </div> 246 247 <p>The {@code container} parameter passed to {@link android.app.Fragment#onCreateView 248 onCreateView()} is the parent {@link android.view.ViewGroup} (from the activity's layout) in which 249 your fragment layout 250 will be inserted. The {@code savedInstanceState} parameter is a {@link android.os.Bundle} that 251 provides data about the previous instance of the fragment, if the fragment is being resumed 252 (restoring state is discussed more in the section about <a href="#Lifecycle">Handling the 253 Fragment Lifecycle</a>).</p> 254 255 <p>The {@link android.view.LayoutInflater#inflate(int,ViewGroup,boolean) inflate()} method takes 256 three arguments:</p> 257 <ul> 258 <li>The resource ID of the layout you want to inflate.</li> 259 <li>The {@link android.view.ViewGroup} to be the parent of the inflated layout. Passing the {@code 260 container} is important in order for the system to apply layout parameters to the root view of the 261 inflated layout, specified by the parent view in which it's going.</li> 262 <li>A boolean indicating whether the inflated layout should be attached to the {@link 263 android.view.ViewGroup} (the second parameter) during inflation. (In this case, this 264 is false because the system is already inserting the inflated layout into the {@code 265 container}—passing true would create a redundant view group in the final layout.)</li> 266 </ul> 267 268 <p>Now you've seen how to create a fragment that provides a layout. Next, you need to add 269 the fragment to your activity.</p> 270 271 272 273 <h3 id="Adding">Adding a fragment to an activity</h3> 274 275 <p>Usually, a fragment contributes a portion of UI to the host activity, which is embedded as a part 276 of the activity's overall view hierarchy. There are two ways you can add a fragment to the activity 277 layout:</p> 278 279 <ul> 280 <li><b>Declare the fragment inside the activity's layout file.</b> 281 <p>In this case, you can 282 specify layout properties for the fragment as if it were a view. For example, here's the layout 283 file for an activity with two fragments:</p> 284 <pre> 285 <?xml version="1.0" encoding="utf-8"?> 286 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 287 android:orientation="horizontal" 288 android:layout_width="match_parent" 289 android:layout_height="match_parent"> 290 <fragment android:name="com.example.news.ArticleListFragment" 291 android:id="@+id/list" 292 android:layout_weight="1" 293 android:layout_width="0dp" 294 android:layout_height="match_parent" /> 295 <fragment android:name="com.example.news.ArticleReaderFragment" 296 android:id="@+id/viewer" 297 android:layout_weight="2" 298 android:layout_width="0dp" 299 android:layout_height="match_parent" /> 300 </LinearLayout> 301 </pre> 302 <p>The {@code android:name} attribute in the {@code <fragment>} specifies the {@link 303 android.app.Fragment} class to instantiate in the layout.</p> 304 305 <p>When the system creates this activity layout, it instantiates each fragment specified in the 306 layout and calls the {@link android.app.Fragment#onCreateView onCreateView()} method for each one, 307 to retrieve each fragment's layout. The system inserts the {@link android.view.View} returned by the 308 fragment directly in place of the {@code <fragment>} element.</p> 309 310 <div class="note"> 311 <p><strong>Note:</strong> Each fragment requires a unique identifier that 312 the system can use to restore the fragment if the activity is restarted (and which you can use to 313 capture the fragment to perform transactions, such as remove it). There are three ways to provide an 314 ID for a fragment:</p> 315 <ul> 316 <li>Supply the {@code android:id} attribute with a unique ID.</li> 317 <li>Supply the {@code android:tag} attribute with a unique string.</li> 318 <li>If you provide neither of the previous two, the system uses the ID of the container 319 view.</li> 320 </ul> 321 </div> 322 </li> 323 324 <li><b>Or, programmatically add the fragment to an existing {@link android.view.ViewGroup}.</b> 325 <p>At any time while your activity is running, you can add fragments to your activity layout. You 326 simply need to specify a {@link 327 android.view.ViewGroup} in which to place the fragment.</p> 328 <p>To make fragment transactions in your activity (such as add, remove, or replace a 329 fragment), you must use APIs from {@link android.app.FragmentTransaction}. You can get an instance 330 of {@link android.app.FragmentTransaction} from your {@link android.app.Activity} like this:</p> 331 332 <pre> 333 FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()} 334 FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()}; 335 </pre> 336 337 <p>You can then add a fragment using the {@link 338 android.app.FragmentTransaction#add(int,Fragment) add()} method, specifying the fragment to add and 339 the view in which to insert it. For example:</p> 340 341 <pre> 342 ExampleFragment fragment = new ExampleFragment(); 343 fragmentTransaction.add(R.id.fragment_container, fragment); 344 fragmentTransaction.commit(); 345 </pre> 346 347 <p>The first argument passed to {@link android.app.FragmentTransaction#add(int,Fragment) add()} 348 is the {@link android.view.ViewGroup} in which the fragment should be placed, specified by 349 resource ID, and the second parameter is the fragment to add.</p> 350 <p>Once you've made your changes with 351 {@link android.app.FragmentTransaction}, you must 352 call {@link android.app.FragmentTransaction#commit} for the changes to take effect.</p> 353 </li> 354 </ul> 355 356 357 <h4 id="AddingWithoutUI">Adding a fragment without a UI</h4> 358 359 <p>The examples above show how to add a fragment to your activity in order to provide a UI. However, 360 you can also use a fragment to provide a background behavior for the activity without presenting 361 additional UI.</p> 362 363 <p>To add a fragment without a UI, add the fragment from the activity using {@link 364 android.app.FragmentTransaction#add(Fragment,String)} (supplying a unique string "tag" for the 365 fragment, rather than a view ID). This adds the fragment, but, because it's not associated with a 366 view in the activity layout, it does not receive a call to {@link 367 android.app.Fragment#onCreateView onCreateView()}. So you don't need to implement that method.</p> 368 369 <p>Supplying a string tag for the fragment isn't strictly for non-UI fragments—you can also 370 supply string tags to fragments that do have a UI—but if the fragment does not have a 371 UI, then the string tag is the only way to identify it. If you want to get the fragment from the 372 activity later, you need to use {@link android.app.FragmentManager#findFragmentByTag 373 findFragmentByTag()}.</p> 374 375 <p>For an example activity that uses a fragment as a background worker, without a UI, see the <a 376 href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.html">{@code 377 FragmentRetainInstance.java}</a> sample.</p> 378 379 380 381 <h2 id="Managing">Managing Fragments</h2> 382 383 <p>To manage the fragments in your activity, you need to use {@link android.app.FragmentManager}. To 384 get it, call {@link android.app.Activity#getFragmentManager()} from your activity.</p> 385 386 <p>Some things that you can do with {@link android.app.FragmentManager} include:</p> 387 388 <ul> 389 <li>Get fragments that exist in the activity, with {@link 390 android.app.FragmentManager#findFragmentById findFragmentById()} (for fragments that provide a UI in 391 the activity layout) or {@link android.app.FragmentManager#findFragmentByTag 392 findFragmentByTag()} (for fragments that do or don't provide a UI).</li> 393 <li>Pop fragments off the back stack, with {@link 394 android.app.FragmentManager#popBackStack()} (simulating a <em>Back</em> command by the user).</li> 395 <li>Register a listener for changes to the back stack, with {@link 396 android.app.FragmentManager#addOnBackStackChangedListener addOnBackStackChangedListener()}.</li> 397 </ul> 398 399 <p>For more information about these methods and others, refer to the {@link 400 android.app.FragmentManager} class documentation.</p> 401 402 <p>As demonstrated in the previous section, you can also use {@link android.app.FragmentManager} 403 to open a {@link android.app.FragmentTransaction}, which allows you to perform transactions, such as 404 add and remove fragments.</p> 405 406 407 <h2 id="Transactions">Performing Fragment Transactions</h2> 408 409 <p>A great feature about using fragments in your activity is the ability to add, remove, replace, 410 and perform other actions with them, in response to user interaction. Each set of changes that you 411 commit to the activity is called a transaction and you can perform one using APIs in {@link 412 android.app.FragmentTransaction}. You can also save each transaction to a back stack managed by the 413 activity, allowing the user to navigate backward through the fragment changes (similar to navigating 414 backward through activities).</p> 415 416 <p>You can acquire an instance of {@link android.app.FragmentTransaction} from the {@link 417 android.app.FragmentManager} like this:</p> 418 419 <pre> 420 FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()}; 421 FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()}; 422 </pre> 423 424 <p>Each transaction is a set of changes that you want to perform at the same time. You can set 425 up all the changes you want to perform for a given transaction using methods such as {@link 426 android.app.FragmentTransaction#add add()}, {@link android.app.FragmentTransaction#remove remove()}, 427 and {@link android.app.FragmentTransaction#replace replace()}. Then, to apply the transaction 428 to the activity, you must call {@link android.app.FragmentTransaction#commit()}.</p> 429 </dl> 430 431 <p>Before you call {@link 432 android.app.FragmentTransaction#commit()}, however, you might want to call {@link 433 android.app.FragmentTransaction#addToBackStack addToBackStack()}, in order to add the transaction 434 to a back stack of fragment transactions. This back stack is managed by the activity and allows 435 the user to return to the previous fragment state, by pressing the <em>Back</em> button.</p> 436 437 <p>For example, here's how you can replace one fragment with another, and preserve the previous 438 state in the back stack:</p> 439 440 <pre> 441 // Create new fragment and transaction 442 Fragment newFragment = new ExampleFragment(); 443 FragmentTransaction transaction = getFragmentManager().beginTransaction(); 444 445 // Replace whatever is in the fragment_container view with this fragment, 446 // and add the transaction to the back stack 447 transaction.replace(R.id.fragment_container, newFragment); 448 transaction.addToBackStack(null); 449 450 // Commit the transaction 451 transaction.commit(); 452 </pre> 453 454 <p>In this example, {@code newFragment} replaces whatever fragment (if any) is currently in the 455 layout container identified by the {@code R.id.fragment_container} ID. By calling {@link 456 android.app.FragmentTransaction#addToBackStack addToBackStack()}, the replace transaction is 457 saved to the back stack so the user can reverse the transaction and bring back the 458 previous fragment by pressing the <em>Back</em> button.</p> 459 460 <p>If you add multiple changes to the transaction (such as another {@link 461 android.app.FragmentTransaction#add add()} or {@link android.app.FragmentTransaction#remove 462 remove()}) and call {@link 463 android.app.FragmentTransaction#addToBackStack addToBackStack()}, then all changes applied 464 before you call {@link android.app.FragmentTransaction#commit commit()} are added to the 465 back stack as a single transaction and the <em>Back</em> button will reverse them all together.</p> 466 467 <p>The order in which you add changes to a {@link android.app.FragmentTransaction} doesn't matter, 468 except:</p> 469 <ul> 470 <li>You must call {@link android.app.FragmentTransaction#commit()} last</li> 471 <li>If you're adding multiple fragments to the same container, then the order in which 472 you add them determines the order they appear in the view hierarchy</li> 473 </ul> 474 475 <p>If you do not call {@link android.app.FragmentTransaction#addToBackStack(String) 476 addToBackStack()} when you perform a transaction that removes a fragment, then that fragment is 477 destroyed when the transaction is committed and the user cannot navigate back to it. Whereas, if you 478 do call {@link android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} when 479 removing a fragment, then the fragment is <em>stopped</em> and will be resumed if the user navigates 480 back.</p> 481 482 <p class="note"><strong>Tip:</strong> For each fragment transaction, you can apply a transition 483 animation, by calling {@link android.app.FragmentTransaction#setTransition setTransition()} before 484 you commit.</p> 485 486 <p>Calling {@link android.app.FragmentTransaction#commit()} does not perform the transaction 487 immediately. Rather, it schedules it to run on the activity's UI thread (the "main" thread) as soon 488 as the thread is able to do so. If necessary, however, you may call {@link 489 android.app.FragmentManager#executePendingTransactions()} from your UI thread to immediately execute 490 transactions submitted by {@link android.app.FragmentTransaction#commit()}. Doing so is 491 usually not necessary unless the transaction is a dependency for jobs in other threads.</p> 492 493 <p class="caution"><strong>Caution:</strong> You can commit a transaction using {@link 494 android.app.FragmentTransaction#commit commit()} only prior to the activity <a 495 href="{@docRoot}guide/components/activities.html#SavingActivityState">saving its 496 state</a> (when the user leaves the activity). If you attempt to commit after that point, an 497 exception will be thrown. This is because the state after the commit can be lost if the activity 498 needs to be restored. For situations in which its okay that you lose the commit, use {@link 499 android.app.FragmentTransaction#commitAllowingStateLoss()}.</p> 500 501 502 503 504 <h2 id="CommunicatingWithActivity">Communicating with the Activity</h2> 505 506 <p>Although a {@link android.app.Fragment} is implemented as an object that's independent from an 507 {@link android.app.Activity} and can be used inside multiple activities, a given instance of 508 a fragment is directly tied to the activity that contains it.</p> 509 510 <p>Specifically, the fragment can access the {@link android.app.Activity} instance with {@link 511 android.app.Fragment#getActivity()} and easily perform tasks such as find a view in the 512 activity layout:</p> 513 514 <pre> 515 View listView = {@link android.app.Fragment#getActivity()}.{@link android.app.Activity#findViewById findViewById}(R.id.list); 516 </pre> 517 518 <p>Likewise, your activity can call methods in the fragment by acquiring a reference to the 519 {@link android.app.Fragment} from {@link android.app.FragmentManager}, using {@link 520 android.app.FragmentManager#findFragmentById findFragmentById()} or {@link 521 android.app.FragmentManager#findFragmentByTag findFragmentByTag()}. For example:</p> 522 523 <pre> 524 ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 525 </pre> 526 527 528 <h3 id="EventCallbacks">Creating event callbacks to the activity</h3> 529 530 <p>In some cases, you might need a fragment to share events with the activity. A good way to do that 531 is to define a callback interface inside the fragment and require that the host activity implement 532 it. When the activity receives a callback through the interface, it can share the information with 533 other fragments in the layout as necessary.</p> 534 535 <p>For example, if a news application has two fragments in an activity—one to show a list of 536 articles (fragment A) and another to display an article (fragment B)—then fragment A must tell 537 the activity when a list item is selected so that it can tell fragment B to display the article. In 538 this case, the {@code OnArticleSelectedListener} interface is declared inside fragment A:</p> 539 540 <pre> 541 public static class FragmentA extends ListFragment { 542 ... 543 // Container Activity must implement this interface 544 public interface OnArticleSelectedListener { 545 public void onArticleSelected(Uri articleUri); 546 } 547 ... 548 } 549 </pre> 550 551 <p>Then the activity that hosts the fragment implements the {@code OnArticleSelectedListener} 552 interface and 553 overrides {@code onArticleSelected()} to notify fragment B of the event from fragment A. To ensure 554 that the host activity implements this interface, fragment A's {@link 555 android.app.Fragment#onAttach onAttach()} callback method (which the system calls when adding 556 the fragment to the activity) instantiates an instance of {@code OnArticleSelectedListener} by 557 casting the {@link android.app.Activity} that is passed into {@link android.app.Fragment#onAttach 558 onAttach()}:</p> 559 560 <pre> 561 public static class FragmentA extends ListFragment { 562 OnArticleSelectedListener mListener; 563 ... 564 @Override 565 public void onAttach(Activity activity) { 566 super.onAttach(activity); 567 try { 568 mListener = (OnArticleSelectedListener) activity; 569 } catch (ClassCastException e) { 570 throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); 571 } 572 } 573 ... 574 } 575 </pre> 576 577 <p>If the activity has not implemented the interface, then the fragment throws a 578 {@link java.lang.ClassCastException}. 579 On success, the {@code mListener} member holds a reference to activity's implementation of 580 {@code OnArticleSelectedListener}, so that fragment A can share events with the activity by calling 581 methods defined by the {@code OnArticleSelectedListener} interface. For example, if fragment A is an 582 extension of {@link android.app.ListFragment}, each time 583 the user clicks a list item, the system calls {@link android.app.ListFragment#onListItemClick 584 onListItemClick()} in the fragment, which then calls {@code onArticleSelected()} to share 585 the event with the activity:</p> 586 587 <pre> 588 public static class FragmentA extends ListFragment { 589 OnArticleSelectedListener mListener; 590 ... 591 @Override 592 public void onListItemClick(ListView l, View v, int position, long id) { 593 // Append the clicked item's row ID with the content provider Uri 594 Uri noteUri = ContentUris.{@link android.content.ContentUris#withAppendedId withAppendedId}(ArticleColumns.CONTENT_URI, id); 595 // Send the event and Uri to the host activity 596 mListener.onArticleSelected(noteUri); 597 } 598 ... 599 } 600 </pre> 601 602 <p>The {@code id} parameter passed to {@link 603 android.app.ListFragment#onListItemClick onListItemClick()} is the row ID of the clicked item, 604 which the activity (or other fragment) uses to fetch the article from the application's {@link 605 android.content.ContentProvider}.</p> 606 607 <p><!--To see a complete implementation of this kind of callback interface, see the <a 608 href="{@docRoot}resources/samples/NotePad/index.html">NotePad sample</a>. -->More information about 609 using a content provider is available in the <a 610 href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a> document.</p> 611 612 613 614 <h3 id="ActionBar">Adding items to the Action Bar</h3> 615 616 <p>Your fragments can contribute menu items to the activity's <a 617 href="{@docRoot}guide/topics/ui/menus.html#options-menu">Options Menu</a> (and, consequently, the <a 618 href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a>) by implementing 619 {@link android.app.Fragment#onCreateOptionsMenu(Menu,MenuInflater) onCreateOptionsMenu()}. In order 620 for this method to receive calls, however, you must call {@link 621 android.app.Fragment#setHasOptionsMenu(boolean) setHasOptionsMenu()} during {@link 622 android.app.Fragment#onCreate(Bundle) onCreate()}, to indicate that the fragment 623 would like to add items to the Options Menu (otherwise, the fragment will not receive a call to 624 {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()}).</p> 625 626 <p>Any items that you then add to the Options Menu from the fragment are appended to the existing 627 menu items. The fragment also receives callbacks to {@link 628 android.app.Fragment#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} when a menu item 629 is selected.</p> 630 631 <p>You can also register a view in your fragment layout to provide a context menu by calling {@link 632 android.app.Fragment#registerForContextMenu(View) registerForContextMenu()}. When the user opens 633 the context menu, the fragment receives a call to {@link 634 android.app.Fragment#onCreateContextMenu(ContextMenu,View,ContextMenu.ContextMenuInfo) 635 onCreateContextMenu()}. When the user selects an item, the fragment receives a call to {@link 636 android.app.Fragment#onContextItemSelected(MenuItem) onContextItemSelected()}.</p> 637 638 <p class="note"><strong>Note:</strong> Although your fragment receives an on-item-selected callback 639 for each menu item it adds, the activity is first to receive the respective callback when the user 640 selects a menu item. If the activity's implementation of the on-item-selected callback does not 641 handle the selected item, then the event is passed to the fragment's callback. This is true for 642 the Options Menu and context menus.</p> 643 644 <p>For more information about menus, see the <a 645 href="{@docRoot}guide/topics/ui/menus.html">Menus</a> and <a 646 href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guides.</p> 647 648 649 650 651 <h2 id="Lifecycle">Handling the Fragment Lifecycle</h2> 652 653 <div class="figure" style="width:350px"> 654 <img src="{@docRoot}images/activity_fragment_lifecycle.png" alt=""/> 655 <p class="img-caption"><strong>Figure 3.</strong> The effect of the activity lifecycle on the fragment 656 lifecycle.</p> 657 </div> 658 659 <p>Managing the lifecycle of a fragment is a lot like managing the lifecycle of an activity. Like 660 an activity, a fragment can exist in three states:</p> 661 662 <dl> 663 <dt><i>Resumed</i></dt> 664 <dd>The fragment is visible in the running activity.</dd> 665 666 <dt><i>Paused</i></dt> 667 <dd>Another activity is in the foreground and has focus, but the activity in which this 668 fragment lives is still visible (the foreground activity is partially transparent or doesn't 669 cover the entire screen).</dd> 670 671 <dt><i>Stopped</i></dt> 672 <dd>The fragment is not visible. Either the host activity has been stopped or the 673 fragment has been removed from the activity but added to the back stack. A stopped fragment is 674 still alive (all state and member information is retained by the system). However, it is no longer 675 visible to the user and will be killed if the activity is killed.</dd> 676 </dl> 677 678 <p>Also like an activity, you can retain the state of a fragment using a {@link 679 android.os.Bundle}, in case the activity's process is killed and you need to restore the 680 fragment state when the activity is recreated. You can save the state during the fragment's {@link 681 android.app.Fragment#onSaveInstanceState onSaveInstanceState()} callback and restore it during 682 either {@link android.app.Fragment#onCreate onCreate()}, {@link 683 android.app.Fragment#onCreateView onCreateView()}, or {@link 684 android.app.Fragment#onActivityCreated onActivityCreated()}. For more information about saving 685 state, see the <a 686 href="{@docRoot}guide/components/activities.html#SavingActivityState">Activities</a> 687 document.</p> 688 689 <p>The most significant difference in lifecycle between an activity and a fragment is how one is 690 stored in its respective back stack. An activity is placed into a back stack of activities 691 that's managed by the system when it's stopped, by default (so that the user can navigate back 692 to it with the <em>Back</em> button, as discussed in <a 693 href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back Stack</a>). 694 However, a fragment is placed into a back stack managed by the host activity only when you 695 explicitly request that the instance be saved by calling {@link 696 android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} during a transaction that 697 removes the fragment.</p> 698 699 <p>Otherwise, managing the fragment lifecycle is very similar to managing the activity 700 lifecycle. So, the same practices for <a 701 href="{@docRoot}guide/components/activities.html#Lifecycle">managing the activity 702 lifecycle</a> also apply to fragments. What you also need to understand, though, is how the life 703 of the activity affects the life of the fragment.</p> 704 705 <p class="caution"><strong>Caution:</strong> If you need a {@link android.content.Context} object 706 within your {@link android.app.Fragment}, you can call {@link android.app.Fragment#getActivity()}. 707 However, be careful to call {@link android.app.Fragment#getActivity()} only when the fragment is 708 attached to an activity. When the fragment is not yet attached, or was detached during the end of 709 its lifecycle, {@link android.app.Fragment#getActivity()} will return null.</p> 710 711 712 <h3 id="CoordinatingWithActivity">Coordinating with the activity lifecycle</h3> 713 714 <p>The lifecycle of the activity in which the fragment lives directly affects the lifecycle of the 715 fragment, such that each lifecycle callback for the activity results in a similar callback for each 716 fragment. For example, when the activity receives {@link android.app.Activity#onPause}, each 717 fragment in the activity receives {@link android.app.Fragment#onPause}.</p> 718 719 <p>Fragments have a few extra lifecycle callbacks, however, that handle unique interaction with the 720 activity in order to perform actions such as build and destroy the fragment's UI. These additional 721 callback methods are:</p> 722 723 <dl> 724 <dt>{@link android.app.Fragment#onAttach onAttach()}</dt> 725 <dd>Called when the fragment has been associated with the activity (the {@link 726 android.app.Activity} is passed in here).</dd> 727 <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt> 728 <dd>Called to create the view hierarchy associated with the fragment.</dd> 729 <dt>{@link android.app.Fragment#onActivityCreated onActivityCreated()}</dt> 730 <dd>Called when the activity's {@link android.app.Activity#onCreate 731 onCreate()} method has returned.</dd> 732 <dt>{@link android.app.Fragment#onDestroyView onDestroyView()}</dt> 733 <dd>Called when the view hierarchy associated with the fragment is being removed.</dd> 734 <dt>{@link android.app.Fragment#onDetach onDetach()}</dt> 735 <dd>Called when the fragment is being disassociated from the activity.</dd> 736 </dl> 737 738 <p>The flow of a fragment's lifecycle, as it is affected by its host activity, is illustrated 739 by figure 3. In this figure, you can see how each successive state of the activity determines which 740 callback methods a fragment may receive. For example, when the activity has received its {@link 741 android.app.Activity#onCreate onCreate()} callback, a fragment in the activity receives no more than 742 the {@link android.app.Fragment#onActivityCreated onActivityCreated()} callback.</p> 743 744 <p>Once the activity reaches the resumed state, you can freely add and remove fragments to the 745 activity. Thus, only while the activity is in the resumed state can the lifecycle of a fragment 746 change independently.</p> 747 748 <p>However, when the activity leaves the resumed state, the fragment again is pushed through its 749 lifecycle by the activity.</p> 750 751 752 753 754 <h2 id="Example">Example</h2> 755 756 <p>To bring everything discussed in this document together, here's an example of an activity 757 using two fragments to create a two-pane layout. The activity below includes one fragment to 758 show a list of Shakespeare play titles and another to show a summary of the play when selected 759 from the list. It also demonstrates how to provide different configurations of the fragments, 760 based on the screen configuration.</p> 761 762 <p class="note"><strong>Note:</strong> The complete source code for this activity is available in 763 <a 764 href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html">{@code 765 FragmentLayout.java}</a>.</p> 766 767 <p>The main activity applies a layout in the usual way, during {@link 768 android.app.Activity#onCreate onCreate()}:</p> 769 770 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java main} 771 772 <p>The layout applied is {@code fragment_layout.xml}:</p> 773 774 {@sample development/samples/ApiDemos/res/layout-land/fragment_layout.xml layout} 775 776 <p>Using this layout, the system instantiates the {@code TitlesFragment} (which lists the play 777 titles) as soon as the activity loads the layout, while the {@link android.widget.FrameLayout} 778 (where the fragment for showing the play summary will go) consumes space on the right side of the 779 screen, but remains empty at first. As you'll see below, it's not until the user selects an item 780 from the list that a fragment is placed into the {@link android.widget.FrameLayout}.</p> 781 782 <p>However, not all screen configurations are wide enough to show both the list of 783 plays and the summary, side by side. So, the layout above is used only for the landscape 784 screen configuration, by saving it at {@code res/layout-land/fragment_layout.xml}.</p> 785 786 <p>Thus, when the screen is in portrait orientation, the system applies the following layout, which 787 is saved at {@code res/layout/fragment_layout.xml}:</p> 788 789 {@sample development/samples/ApiDemos/res/layout/fragment_layout.xml layout} 790 791 <p>This layout includes only {@code TitlesFragment}. This means that, when the device is in 792 portrait orientation, only the list of play titles is visible. So, when the user clicks a list 793 item in this configuration, the application will start a new activity to show the summary, 794 instead of loading a second fragment.</p> 795 796 <p>Next, you can see how this is accomplished in the fragment classes. First is {@code 797 TitlesFragment}, which shows the list of Shakespeare play titles. This fragment extends {@link 798 android.app.ListFragment} and relies on it to handle most of the list view work.</p> 799 800 <p>As you inspect this code, notice that there are two possible behaviors when the user clicks a 801 list item: depending on which of the two layouts is active, it can either create and display a new 802 fragment to show the details in the same activity (adding the fragment to the {@link 803 android.widget.FrameLayout}), or start a new activity (where the fragment can be shown).</p> 804 805 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java titles} 806 807 <p>The second fragment, {@code DetailsFragment} shows the play summary for the item selected from 808 the list from {@code TitlesFragment}:</p> 809 810 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java details} 811 812 <p>Recall from the {@code TitlesFragment} class, that, if the user clicks a list item and the 813 current layout does <em>not</em> include the {@code R.id.details} view (which is where the 814 {@code DetailsFragment} belongs), then the application starts the {@code DetailsActivity} 815 activity to display the content of the item.</p> 816 817 <p>Here is the {@code DetailsActivity}, which simply embeds the {@code DetailsFragment} to display 818 the selected play summary when the screen is in portrait orientation:</p> 819 820 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java 821 details_activity} 822 823 <p>Notice that this activity finishes itself if the configuration is landscape, so that the main 824 activity can take over and display the {@code DetailsFragment} alongside the {@code TitlesFragment}. 825 This can happen if the user begins the {@code DetailsActivity} while in portrait orientation, but 826 then rotates to landscape (which restarts the current activity).</p> 827 828 829 <p>For more samples using fragments (and complete source files for this example), 830 see the API Demos sample app available in <a 831 href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment"> 832 ApiDemos</a> (available for download from the <a 833 href="{@docRoot}resources/samples/get.html">Samples SDK component</a>).</p> 834 835 836