• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Fragments
2parent.title=Activities
3parent.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
53and 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
60multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a
61modular section of an activity, which has its own lifecycle, receives its own input events, and
62which you can add or remove while the activity is running (sort of like a "sub activity" that
63you 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
66affected by the host activity's lifecycle. For example, when the activity is paused, so are all
67fragments in it, and when the activity is destroyed, so are all fragments. However, while an
68activity is running (it is in the <em>resumed</em> <a
69href="{@docRoot}guide/components/activities.html#Lifecycle">lifecycle state</a>), you can
70manipulate each fragment independently, such as add or remove them. When you perform such a
71fragment transaction, you can also add it to a back stack that's managed by the
72activity&mdash;each back stack entry in the activity is a record of the fragment transaction that
73occurred. The back stack allows the user to reverse a fragment transaction (navigate backwards),
74by 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
77android.view.ViewGroup} inside the activity's view hierarchy and the fragment defines its own view
78layout.
79You can insert a fragment into your activity layout by declaring the fragment in the activity's
80layout file, as a {@code &lt;fragment&gt;} element, or from your application code by adding it to an
81existing {@link android.view.ViewGroup}. However, a fragment is not required to be a part of the
82activity layout; you may also use a fragment without its own UI as an invisible worker for the
83activity.</p>
84
85<p>This document describes how to build your application to use fragments, including
86how fragments can maintain their state when added to the activity's back stack, share
87events with the activity and other fragments in the activity, contribute to the activity's action
88bar, 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
94dynamic and flexible UI designs on large screens, such as tablets. Because a
95tablet's screen is much larger than that of a handset, there's more room to combine and
96interchange UI components. Fragments allow such designs without the need for you to manage complex
97changes to the view hierarchy. By dividing the layout of an activity into fragments, you become able
98to modify the activity's appearance at runtime and preserve those changes in a back stack
99that'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
102left and another fragment to display an article on the right&mdash;both fragments appear in one
103activity, side by side, and each fragment has its own set of lifecycle callback methods and handle
104their own user input events. Thus, instead of using one activity to select an article and another
105activity to read the article, the user can select an article and read it all within the same
106activity, 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
109each fragment defines its own layout and its own behavior with its own lifecycle callbacks, you can
110include one fragment in multiple activities, so you should design for reuse and avoid directly
111manipulating one fragment from another fragment. This is especially important because a modular
112fragment allows you to change your fragment combinations for different screen sizes. When designing
113your application to support both tablets and handsets, you can reuse your fragments in different
114layout configurations to optimize the user experience based on the available screen space. For
115example, on a handset, it might be necessary to separate fragments to provide a single-pane UI when
116more 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
120fragments can be combined into one activity for a tablet design, but separated for a
121handset design.</p>
122
123<p>For example&mdash;to continue with the news application example&mdash;the application can embed
124two fragments in <em>Activity A</em>, when running on a tablet-sized device. However, on a
125handset-sized screen, there's not enough room for both fragments, so <em>Activity A</em> includes
126only 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
128supports both tablets and handsets by reusing fragments in different combinations, as illustrated in
129figure 1.</p>
130
131<p>For more information about designing your application with different fragment combinations for
132different screen configurations, see the guide to <a
133href="{@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
142activity 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
146subclass of it). The {@link android.app.Fragment} class has code that looks a lot like
147an {@link android.app.Activity}. It contains callback methods similar to an activity, such
148as {@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
150fact, if you're converting an existing Android application to use fragments, you might simply move
151code from your activity's callback methods into the respective callback methods of your
152fragment.</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
159initialize essential components of the fragment that you want to retain when the fragment is
160paused 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
163first time. To draw a UI for your fragment, you must return a {@link android.view.View} from this
164method that is the root of your fragment's layout. You can return null if the fragment does not
165provide 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
168fragment (though it does not always mean the fragment is being destroyed). This is usually where you
169should commit any changes that should be persisted beyond the current user session (because
170the 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
174several other callback methods you should also use to handle various stages of the
175fragment lifecycle. All the lifecycle callback methods are discussed in more detail in the section
176about <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
180android.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
185the dialog helper methods in the {@link android.app.Activity} class, because you can
186incorporate a fragment dialog into the back stack of fragments managed by the activity,
187allowing 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
191android.widget.SimpleCursorAdapter}), similar to {@link android.app.ListActivity}. It provides
192several methods for managing a list view, such as the {@link
193android.app.ListFragment#onListItemClick(ListView,View,int,long) onListItemClick()} callback to
194handle 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"
199activity 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
206layout to the activity.</p>
207
208<p>To provide a layout for a fragment, you must implement the {@link
209android.app.Fragment#onCreateView onCreateView()} callback method, which the Android system calls
210when 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
214android.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
218android.app.Fragment#onCreateView onCreateView()}, you can inflate it from a <a
219href="{@docRoot}guide/topics/resources/layout-resource.html">layout resource</a> defined in XML. To
220help 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>
227public static class ExampleFragment extends Fragment {
228    &#64;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
241named {@code example_fragment.xml} saved in the application resources. For information about how to
242create a layout in XML, see the <a href="{@docRoot}guide/topics/ui/index.html">User Interface</a>
243documentation.</p>
244</div>
245</div>
246
247<p>The {@code container} parameter passed to {@link android.app.Fragment#onCreateView
248onCreateView()} is the parent {@link android.view.ViewGroup} (from the activity's layout) in which
249your fragment layout
250will be inserted. The {@code savedInstanceState} parameter is a {@link android.os.Bundle} that
251provides 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
253Fragment Lifecycle</a>).</p>
254
255<p>The {@link android.view.LayoutInflater#inflate(int,ViewGroup,boolean) inflate()} method takes
256three 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
260container} is important in order for the system to apply layout parameters to the root view of the
261inflated 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
263android.view.ViewGroup} (the second parameter) during inflation. (In this case, this
264is false because the system is already inserting the inflated layout into the {@code
265container}&mdash;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
269the 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
276of the activity's overall view hierarchy. There are two ways you can add a fragment to the activity
277layout:</p>
278
279<ul>
280  <li><b>Declare the fragment inside the activity's layout file.</b>
281<p>In this case, you can
282specify layout properties for the fragment as if it were a view. For example, here's the layout
283file for an activity with two fragments:</p>
284<pre>
285&lt;?xml version="1.0" encoding="utf-8"?&gt;
286&lt;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"&gt;
290    &lt;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" /&gt;
295    &lt;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" /&gt;
300&lt;/LinearLayout&gt;
301</pre>
302  <p>The {@code android:name} attribute in the {@code &lt;fragment&gt;} specifies the {@link
303android.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
306layout and calls the {@link android.app.Fragment#onCreateView onCreateView()} method for each one,
307to retrieve each fragment's layout. The system inserts the {@link android.view.View} returned by the
308fragment directly in place of the {@code &lt;fragment&gt;} element.</p>
309
310<div class="note">
311  <p><strong>Note:</strong> Each fragment requires a unique identifier that
312the system can use to restore the fragment if the activity is restarted (and which you can use to
313capture the fragment to perform transactions, such as remove it). There are three ways to provide an
314ID 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
319view.</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
326simply need to specify a {@link
327android.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
329fragment), you must use APIs from {@link android.app.FragmentTransaction}. You can get an instance
330of {@link android.app.FragmentTransaction} from your {@link android.app.Activity} like this:</p>
331
332<pre>
333FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()}
334FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()};
335</pre>
336
337<p>You can then add a fragment using the {@link
338android.app.FragmentTransaction#add(int,Fragment) add()} method, specifying the fragment to add and
339the view in which to insert it. For example:</p>
340
341<pre>
342ExampleFragment fragment = new ExampleFragment();
343fragmentTransaction.add(R.id.fragment_container, fragment);
344fragmentTransaction.commit();
345</pre>
346
347  <p>The first argument passed to {@link android.app.FragmentTransaction#add(int,Fragment) add()}
348is the {@link android.view.ViewGroup} in which the fragment should be placed, specified by
349resource 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
352call {@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,
360you can also use a fragment to provide a background behavior for the activity without presenting
361additional UI.</p>
362
363<p>To add a fragment without a UI, add the fragment from the activity using {@link
364android.app.FragmentTransaction#add(Fragment,String)} (supplying a unique string "tag" for the
365fragment, rather than a view ID). This adds the fragment, but, because it's not associated with a
366view in the activity layout, it does not receive a call to {@link
367android.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&mdash;you can also
370supply string tags to fragments that do have a UI&mdash;but if the fragment does not have a
371UI, then the string tag is the only way to identify it. If you want to get the fragment from the
372activity later, you need to use {@link android.app.FragmentManager#findFragmentByTag
373findFragmentByTag()}.</p>
374
375<p>For an example activity that uses a fragment as a background worker, without a UI, see the <a
376href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.html">{@code
377FragmentRetainInstance.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
384get 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
390android.app.FragmentManager#findFragmentById findFragmentById()} (for fragments that provide a UI in
391the activity layout) or {@link android.app.FragmentManager#findFragmentByTag
392findFragmentByTag()} (for fragments that do or don't provide a UI).</li>
393  <li>Pop fragments off the back stack, with {@link
394android.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
396android.app.FragmentManager#addOnBackStackChangedListener addOnBackStackChangedListener()}.</li>
397</ul>
398
399<p>For more information about these methods and others, refer to the {@link
400android.app.FragmentManager} class documentation.</p>
401
402<p>As demonstrated in the previous section, you can also use {@link android.app.FragmentManager}
403to open a {@link android.app.FragmentTransaction}, which allows you to perform transactions, such as
404add 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,
410and perform other actions with them, in response to user interaction. Each set of changes that you
411commit to the activity is called a transaction and you can perform one using APIs in {@link
412android.app.FragmentTransaction}. You can also save each transaction to a back stack managed by the
413activity, allowing the user to navigate backward through the fragment changes (similar to navigating
414backward through activities).</p>
415
416<p>You can acquire an instance of {@link android.app.FragmentTransaction} from the {@link
417android.app.FragmentManager} like this:</p>
418
419<pre>
420FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()};
421FragmentTransaction 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
425up all the changes you want to perform for a given transaction using methods such as {@link
426android.app.FragmentTransaction#add add()}, {@link android.app.FragmentTransaction#remove remove()},
427and {@link android.app.FragmentTransaction#replace replace()}. Then, to apply the transaction
428to the activity, you must call {@link android.app.FragmentTransaction#commit()}.</p>
429</dl>
430
431<p>Before you call {@link
432android.app.FragmentTransaction#commit()}, however, you might want to call {@link
433android.app.FragmentTransaction#addToBackStack addToBackStack()}, in order to add the transaction
434to a back stack of fragment transactions. This back stack is managed by the activity and allows
435the 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
438state in the back stack:</p>
439
440<pre>
441// Create new fragment and transaction
442Fragment newFragment = new ExampleFragment();
443FragmentTransaction 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
447transaction.replace(R.id.fragment_container, newFragment);
448transaction.addToBackStack(null);
449
450// Commit the transaction
451transaction.commit();
452</pre>
453
454<p>In this example, {@code newFragment} replaces whatever fragment (if any) is currently in the
455layout container identified by the {@code R.id.fragment_container} ID. By calling {@link
456android.app.FragmentTransaction#addToBackStack addToBackStack()}, the replace transaction is
457saved to the back stack so the user can reverse the transaction and bring back the
458previous fragment by pressing the <em>Back</em> button.</p>
459
460<p>If you add multiple changes to the transaction (such as another {@link
461android.app.FragmentTransaction#add add()} or {@link android.app.FragmentTransaction#remove
462remove()}) and call {@link
463android.app.FragmentTransaction#addToBackStack addToBackStack()}, then all changes applied
464before you call {@link android.app.FragmentTransaction#commit commit()} are added to the
465back 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,
468except:</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
472you 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)
476addToBackStack()} when you perform a transaction that removes a fragment, then that fragment is
477destroyed when the transaction is committed and the user cannot navigate back to it. Whereas, if you
478do call {@link android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} when
479removing a fragment, then the fragment is <em>stopped</em> and will be resumed if the user navigates
480back.</p>
481
482<p class="note"><strong>Tip:</strong> For each fragment transaction, you can apply a transition
483animation, by calling {@link android.app.FragmentTransaction#setTransition setTransition()} before
484you commit.</p>
485
486<p>Calling {@link android.app.FragmentTransaction#commit()} does not perform the transaction
487immediately. Rather, it schedules it to run on the activity's UI thread (the "main" thread) as soon
488as the thread is able to do so. If necessary, however, you may call {@link
489android.app.FragmentManager#executePendingTransactions()} from your UI thread to immediately execute
490transactions submitted by {@link android.app.FragmentTransaction#commit()}. Doing so is
491usually 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
494android.app.FragmentTransaction#commit commit()} only prior to the activity <a
495href="{@docRoot}guide/components/activities.html#SavingActivityState">saving its
496state</a> (when the user leaves the activity). If you attempt to commit after that point, an
497exception will be thrown. This is because the state after the commit can be lost if the activity
498needs to be restored. For situations in which its okay that you lose the commit, use {@link
499android.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
508a 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
511android.app.Fragment#getActivity()} and easily perform tasks such as find a view in the
512activity layout:</p>
513
514<pre>
515View 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
520android.app.FragmentManager#findFragmentById findFragmentById()} or {@link
521android.app.FragmentManager#findFragmentByTag findFragmentByTag()}. For example:</p>
522
523<pre>
524ExampleFragment 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
531is to define a callback interface inside the fragment and require that the host activity implement
532it. When the activity receives a callback through the interface, it can share the information with
533other fragments in the layout as necessary.</p>
534
535<p>For example, if a news application has two fragments in an activity&mdash;one to show a list of
536articles (fragment A) and another to display an article (fragment B)&mdash;then fragment A must tell
537the activity when a list item is selected so that it can tell fragment B to display the article. In
538this case, the {@code OnArticleSelectedListener} interface is declared inside fragment A:</p>
539
540<pre>
541public 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}
552interface and
553overrides {@code onArticleSelected()} to notify fragment B of the event from fragment A. To ensure
554that the host activity implements this interface, fragment A's {@link
555android.app.Fragment#onAttach onAttach()} callback method (which the system calls when adding
556the fragment to the activity) instantiates an instance of {@code OnArticleSelectedListener} by
557casting the {@link android.app.Activity} that is passed into {@link android.app.Fragment#onAttach
558onAttach()}:</p>
559
560<pre>
561public static class FragmentA extends ListFragment {
562    OnArticleSelectedListener mListener;
563    ...
564    &#64;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}.
579On 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
581methods defined by the {@code OnArticleSelectedListener} interface. For example, if fragment A is an
582extension of {@link android.app.ListFragment}, each time
583the user clicks a list item, the system calls {@link android.app.ListFragment#onListItemClick
584onListItemClick()} in the fragment, which then calls {@code onArticleSelected()} to share
585the event with the activity:</p>
586
587<pre>
588public static class FragmentA extends ListFragment {
589    OnArticleSelectedListener mListener;
590    ...
591    &#64;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
603android.app.ListFragment#onListItemClick onListItemClick()} is the row ID of the clicked item,
604which the activity (or other fragment) uses to fetch the article from the application's {@link
605android.content.ContentProvider}.</p>
606
607<p><!--To see a complete implementation of this kind of callback interface, see the <a
608href="{@docRoot}resources/samples/NotePad/index.html">NotePad sample</a>. -->More information about
609using a content provider is available in the <a
610href="{@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
617href="{@docRoot}guide/topics/ui/menus.html#options-menu">Options Menu</a> (and, consequently, the <a
618href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a>) by implementing
619{@link android.app.Fragment#onCreateOptionsMenu(Menu,MenuInflater) onCreateOptionsMenu()}. In order
620for this method to receive calls, however, you must call {@link
621android.app.Fragment#setHasOptionsMenu(boolean) setHasOptionsMenu()} during {@link
622android.app.Fragment#onCreate(Bundle) onCreate()}, to indicate that the fragment
623would 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
627menu items. The fragment also receives callbacks to {@link
628android.app.Fragment#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} when a menu item
629is selected.</p>
630
631<p>You can also register a view in your fragment layout to provide a context menu by calling {@link
632android.app.Fragment#registerForContextMenu(View) registerForContextMenu()}. When the user opens
633the context menu, the fragment receives a call to {@link
634android.app.Fragment#onCreateContextMenu(ContextMenu,View,ContextMenu.ContextMenuInfo)
635onCreateContextMenu()}. When the user selects an item, the fragment receives a call to {@link
636android.app.Fragment#onContextItemSelected(MenuItem) onContextItemSelected()}.</p>
637
638<p class="note"><strong>Note:</strong> Although your fragment receives an on-item-selected callback
639for each menu item it adds, the activity is first to receive the respective callback when the user
640selects a menu item. If the activity's implementation of the on-item-selected callback does not
641handle the selected item, then the event is passed to the fragment's callback. This is true for
642the Options Menu and context menus.</p>
643
644<p>For more information about menus, see the <a
645href="{@docRoot}guide/topics/ui/menus.html">Menus</a> and <a
646href="{@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
656lifecycle.</p>
657</div>
658
659<p>Managing the lifecycle of a fragment is a lot like managing the lifecycle of an activity. Like
660an 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
668fragment lives is still visible (the foreground activity is partially transparent or doesn't
669cover 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
673fragment has been removed from the activity but added to the back stack. A stopped fragment is
674still alive (all state and member information is retained by the system). However, it is no longer
675visible 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
679android.os.Bundle}, in case the activity's process is killed and you need to restore the
680fragment state when the activity is recreated. You can save the state during the fragment's {@link
681android.app.Fragment#onSaveInstanceState onSaveInstanceState()} callback and restore it during
682either {@link android.app.Fragment#onCreate onCreate()}, {@link
683android.app.Fragment#onCreateView onCreateView()}, or {@link
684android.app.Fragment#onActivityCreated onActivityCreated()}. For more information about saving
685state, see the <a
686href="{@docRoot}guide/components/activities.html#SavingActivityState">Activities</a>
687document.</p>
688
689<p>The most significant difference in lifecycle between an activity and a fragment is how one is
690stored in its respective back stack. An activity is placed into a back stack of activities
691that's managed by the system when it's stopped, by default (so that the user can navigate back
692to it with the <em>Back</em> button, as discussed in <a
693href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back Stack</a>).
694However, a fragment is placed into a back stack managed by the host activity only when you
695explicitly request that the instance be saved by calling {@link
696android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} during a transaction that
697removes the fragment.</p>
698
699<p>Otherwise, managing the fragment lifecycle is very similar to managing the activity
700lifecycle. So, the same practices for <a
701href="{@docRoot}guide/components/activities.html#Lifecycle">managing the activity
702lifecycle</a> also apply to fragments. What you also need to understand, though, is how the life
703of 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
706within your {@link android.app.Fragment}, you can call {@link android.app.Fragment#getActivity()}.
707However, be careful to call {@link android.app.Fragment#getActivity()} only when the fragment is
708attached to an activity. When the fragment is not yet attached, or was detached during the end of
709its 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
715fragment, such that each lifecycle callback for the activity results in a similar callback for each
716fragment. For example, when the activity receives {@link android.app.Activity#onPause}, each
717fragment 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
720activity in order to perform actions such as build and destroy the fragment's UI. These additional
721callback 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
726android.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
731onCreate()} 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
739by figure 3. In this figure, you can see how each successive state of the activity determines which
740callback methods a fragment may receive. For example, when the activity has received its {@link
741android.app.Activity#onCreate onCreate()} callback, a fragment in the activity receives no more than
742the {@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
745activity. Thus, only while the activity is in the resumed state can the lifecycle of a fragment
746change independently.</p>
747
748<p>However, when the activity leaves the resumed state, the fragment again is pushed through its
749lifecycle 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
757using two fragments to create a two-pane layout. The activity below includes one fragment to
758show a list of Shakespeare play titles and another to show a summary of the play when selected
759from the list. It also demonstrates how to provide different configurations of the fragments,
760based 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
764href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html">{@code
765FragmentLayout.java}</a>.</p>
766
767<p>The main activity applies a layout in the usual way, during {@link
768android.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
777titles) 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
779screen, but remains empty at first. As you'll see below, it's not until the user selects an item
780from 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
783plays and the summary, side by side. So, the layout above is used only for the landscape
784screen 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
787is 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
792portrait orientation, only the list of play titles is visible. So, when the user clicks a list
793item in this configuration, the application will start a new activity to show the summary,
794instead of loading a second fragment.</p>
795
796<p>Next, you can see how this is accomplished in the fragment classes. First is {@code
797TitlesFragment}, which shows the list of Shakespeare play titles. This fragment extends {@link
798android.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
801list item: depending on which of the two layouts is active, it can either create and display a new
802fragment to show the details in the same activity (adding the fragment to the {@link
803android.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
808the 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
813current 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}
815activity to display the content of the item.</p>
816
817<p>Here is the {@code DetailsActivity}, which simply embeds the {@code DetailsFragment} to display
818the 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
821details_activity}
822
823<p>Notice that this activity finishes itself if the configuration is landscape, so that the main
824activity can take over and display the {@code DetailsFragment} alongside the {@code TitlesFragment}.
825This can happen if the user begins the {@code DetailsActivity} while in portrait orientation, but
826then 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),
830see the API Demos sample app available in <a
831href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment">
832ApiDemos</a> (available for download from the <a
833href="{@docRoot}resources/samples/get.html">Samples SDK component</a>).</p>
834
835
836