|
| 1 | +page.title=Creating a Fragment |
| 2 | +parent.title=Building a Dynamic UI with Fragments |
| 3 | +parent.link=index.html |
| 4 | + |
| 5 | +trainingnavtop=true |
| 6 | +previous.title=Using the Android Support Library |
| 7 | +previous.link=support-lib.html |
| 8 | +next.title=Building a Flexible UI |
| 9 | +next.link=fragment-ui.html |
| 10 | + |
| 11 | +@jd:body |
| 12 | + |
| 13 | +<div id="tb-wrapper"> |
| 14 | + <div id="tb"> |
| 15 | + |
| 16 | + <h2>This lesson teaches you to</h2> |
| 17 | +<ol> |
| 18 | + <li><a href="#Create">Create a Fragment Class</a></li> |
| 19 | + <li><a href="#AddInLayout">Add a Fragment to an Activity using XML</a></li> |
| 20 | +</ol> |
| 21 | + |
| 22 | + <h2>You should also read</h2> |
| 23 | + <ul> |
| 24 | + <li><a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a></li> |
| 25 | + </ul> |
| 26 | + |
| 27 | +<h2>Try it out</h2> |
| 28 | + |
| 29 | +<div class="download-box"> |
| 30 | + <a href="http://developer.android.com/shareables/training/FragmentBasics.zip" |
| 31 | +class="button">Download the sample</a> |
| 32 | + <p class="filename">FragmentBasics.zip</p> |
| 33 | +</div> |
| 34 | + |
| 35 | + </div> |
| 36 | +</div> |
| 37 | + |
| 38 | +<p>You can think of a fragment as a modular section of an activity, which has its own lifecycle, |
| 39 | +receives its own input events, and which you can add or remove while the activity is running (sort |
| 40 | +of like a "sub activity" that you can reuse in different activities). This lesson shows how to |
| 41 | +extend the {@link android.support.v4.app.Fragment} class using the Support Library so your app |
| 42 | +remains compatible with devices running system versions as old as Android 1.6.</p> |
| 43 | + |
| 44 | +<p class="note"><strong>Note:</strong> If you decide for other reasons that the minimum |
| 45 | +API level your app requires is 11 or higher, you don't need to use the Support |
| 46 | +Library and can instead use the framework's built in {@link android.app.Fragment} class and related |
| 47 | +APIs. Just be aware that this lesson is focused on using the APIs from the Support Library, which |
| 48 | +use a specific package signature and sometimes slightly different API names than the versions |
| 49 | +included in the platform.</p> |
| 50 | + |
| 51 | + |
| 52 | + |
| 53 | +<h2 id="Create">Create a Fragment Class</h2> |
| 54 | + |
| 55 | +<p>To create a fragment, extend the {@link android.support.v4.app.Fragment} class, then override |
| 56 | +key lifecycle methods to insert your app logic, similar to the way you would with an {@link |
| 57 | +android.app.Activity} class.</p> |
| 58 | + |
| 59 | +<p>One difference when creating a {@link android.support.v4.app.Fragment} is that you must use the |
| 60 | +{@link android.support.v4.app.Fragment#onCreateView onCreateView()} callback to define the layout. |
| 61 | +In fact, this is the only callback you need in order to get a fragment running. For |
| 62 | +example, here's a simple fragment that specifies its own layout:</p> |
| 63 | + |
| 64 | +<pre> |
| 65 | +import android.os.Bundle; |
| 66 | +import android.support.v4.app.Fragment; |
| 67 | +import android.view.LayoutInflater; |
| 68 | +import android.view.ViewGroup; |
| 69 | + |
| 70 | +public class ArticleFragment extends Fragment { |
| 71 | + @Override |
| 72 | + public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| 73 | + Bundle savedInstanceState) { |
| 74 | + // Inflate the layout for this fragment |
| 75 | + return inflater.inflate(R.layout.article_view, container, false); |
| 76 | + } |
| 77 | +} |
| 78 | +</pre> |
| 79 | + |
| 80 | +<p>Just like an activity, a fragment should implement other lifecycle callbacks that allow you to |
| 81 | +manage its state as it is added or removed from the activity and as the activity transitions |
| 82 | +between its lifecycle states. For instance, when the activity's {@link |
| 83 | +android.app.Activity#onPause()} method is called, any fragments in the activity also receive a call |
| 84 | +to {@link android.support.v4.app.Fragment#onPause()}.</p> |
| 85 | + |
| 86 | +<p>More information about the fragment lifecycle and callback methods is available in the <a |
| 87 | +href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</p> |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | +<h2 id="AddInLayout">Add a Fragment to an Activity using XML</h2> |
| 92 | + |
| 93 | +<p>While fragments are reusable, modular UI components, each instance of a {@link |
| 94 | +android.support.v4.app.Fragment} class must be associated with a parent {@link |
| 95 | +android.support.v4.app.FragmentActivity}. You can achieve this association by defining each |
| 96 | +fragment within your activity layout XML file.</p> |
| 97 | + |
| 98 | +<p class="note"><strong>Note:</strong> {@link android.support.v4.app.FragmentActivity} is a |
| 99 | +special activity provided in the Support Library to handle fragments on system versions older than |
| 100 | +API level 11. If the lowest system version you support is API level 11 or higher, then you can use a |
| 101 | +regular {@link android.app.Activity}.</p> |
| 102 | + |
| 103 | +<p>Here is an example layout file that adds two fragments to an activity when the device |
| 104 | +screen is considered "large" (specified by the <code>large</code> qualifier in the directory |
| 105 | +name).</p> |
| 106 | + |
| 107 | +<p><code>res/layout-large/news_articles.xml:</code></p> |
| 108 | +<pre> |
| 109 | +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
| 110 | + android:orientation="horizontal" |
| 111 | + android:layout_width="fill_parent" |
| 112 | + android:layout_height="fill_parent"> |
| 113 | + |
| 114 | + <fragment android:name="com.example.android.fragments.HeadlinesFragment" |
| 115 | + android:id="@+id/headlines_fragment" |
| 116 | + android:layout_weight="1" |
| 117 | + android:layout_width="0dp" |
| 118 | + android:layout_height="match_parent" /> |
| 119 | + |
| 120 | + <fragment android:name="com.example.android.fragments.ArticleFragment" |
| 121 | + android:id="@+id/article_fragment" |
| 122 | + android:layout_weight="2" |
| 123 | + android:layout_width="0dp" |
| 124 | + android:layout_height="match_parent" /> |
| 125 | + |
| 126 | +</LinearLayout> |
| 127 | +</pre> |
| 128 | + |
| 129 | +<p class="note"><strong>Tip:</strong> For more information about creating layouts for different |
| 130 | +screen sizes, read <a href="{@docRoot}training/multiscreen/screensizes.html">Supporting Different |
| 131 | +Screen Sizes</a>.</p> |
| 132 | + |
| 133 | +<p>Here's how an activity applies this layout:</p> |
| 134 | + |
| 135 | +<pre> |
| 136 | +import android.os.Bundle; |
| 137 | +import android.support.v4.app.FragmentActivity; |
| 138 | + |
| 139 | +public class MainActivity extends FragmentActivity { |
| 140 | + @Override |
| 141 | + public void onCreate(Bundle savedInstanceState) { |
| 142 | + super.onCreate(savedInstanceState); |
| 143 | + setContentView(R.layout.news_articles); |
| 144 | + } |
| 145 | +} |
| 146 | +</pre> |
| 147 | + |
| 148 | + |
| 149 | +<p class="note"><strong>Note:</strong> When you add a fragment to an activity layout by defining |
| 150 | +the fragment in the layout XML file, you <em>cannot</em> remove the fragment at runtime. If you plan |
| 151 | +to swap your fragments in and out during user interaction, you must add the fragment to the activity |
| 152 | +when the activity first starts, as shown in the next lesson.</p> |
| 153 | + |
| 154 | + |
| 155 | + |
0 commit comments