Home | History | Annotate | Download | only in components
      1 page.title=Fragmen
      2 parent.title=Aktivitas
      3 parent.link=activities.html
      4 @jd:body
      5 
      6 <div id="qv-wrapper">
      7 <div id="qv">
      8   <h2>Dalam dokumen ini</h2>
      9   <ol>
     10     <li><a href="#Design">Filosofi Desain</a></li>
     11     <li><a href="#Creating">Membuat Fragmen</a>
     12       <ol>
     13         <li><a href="#UI">Menambahkan antarmuka pengguna</a></li>
     14         <li><a href="#Adding">Menambahkan fragmen ke aktivitas</a></li>
     15       </ol>
     16     </li>
     17     <li><a href="#Managing">Mengelola Fragmen</a></li>
     18     <li><a href="#Transactions">Melakukan Transaksi Fragmen</a></li>
     19     <li><a href="#CommunicatingWithActivity">Berkomunikasi dengan Aktivitas</a>
     20       <ol>
     21         <li><a href="#EventCallbacks">Membuat callback kejadian pada aktivitas</a></li>
     22         <li><a href="#ActionBar">Menambahkan item ke Action-Bar</a></li>
     23       </ol>
     24     </li>
     25     <li><a href="#Lifecycle">Menangani Daur Hidup Fragmen</a>
     26       <ol>
     27         <li><a href="#CoordinatingWithActivity">Mengoordinasi dengan daur hidup aktivitas</a></li>
     28       </ol>
     29     </li>
     30     <li><a href="#Example">Contoh</a></li>
     31   </ol>
     32 
     33   <h2>Kelas-kelas utama</h2>
     34   <ol>
     35     <li>{@link android.app.Fragment}</li>
     36     <li>{@link android.app.FragmentManager}</li>
     37     <li>{@link android.app.FragmentTransaction}</li>
     38   </ol>
     39 
     40   <h2>Lihat juga</h2>
     41   <ol>
     42     <li><a href="{@docRoot}training/basics/fragments/index.html">Membangun UI Dinamis dengan Fragmen</a></li>
     43     <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">Mendukung Tablet
     44 dan Handset</a></li>
     45   </ol>
     46 </div>
     47 </div>
     48 
     49 <p>{@link android.app.Fragment} mewakili perilaku atau bagian dari antarmuka pengguna dalam
     50 {@link android.app.Activity}. Anda bisa mengombinasikan beberapa fragmen dalam satu aktivitas untuk membangun UI
     51 multipanel dan menggunakan kembali sebuah fragmen dalam beberapa aktivitas. Anda bisa menganggap fragmen sebagai bagian
     52 modular dari aktivitas, yang memiliki daur hidup sendiri, menerima kejadian input sendiri, dan
     53 yang bisa Anda tambahkan atau hapus saat aktivitas berjalan (semacam "sub aktivitas" yang
     54 bisa digunakan kembali dalam aktivitas berbeda).</p>
     55 
     56 <p>Fragmen harus selalu tertanam dalam aktivitas dan daur hidup fragmen secara langsung
     57 dipengaruhi oleh daur hidup aktivitas host-nya. Misalnya, saat aktivitas dihentikan sementara,
     58 semua fragmen di dalamnya juga dihentikan sementara, dan bila aktivitas dimusnahkan, semua fragmen juga demikian. Akan tetapi, saat
     59 aktivitas berjalan (dalam <a href="{@docRoot}guide/components/activities.html#Lifecycle">status daur hidup</a> <em>dilanjutkan</em>, Anda bisa
     60 memanipulasi setiap fragmen secara terpisah, seperti menambah atau menghapusnya. Saat melakukan transaksi
     61 fragmen, Anda juga bisa menambahkannya ke back-stack yang dikelola oleh aktivitas
     62 &mdash;setiap entri back-stack merupakan record transaksi fragmen yang
     63 terjadi. Dengan back-stack pengguna dapat membalikkan transaksi fragmen (mengarah mundur),
     64 dengan menekan tombol <em>Back</em>.</p>
     65 
     66 <p>Bila Anda menambahkan fragmen sebagai bagian dari layout aktivitas, fragmen itu berada dalam {@link
     67 android.view.ViewGroup} di hierarki tampilan aktivitas tersebut dan fragmen mendefinisikan
     68 layout
     69 tampilannya sendiri. Anda bisa menyisipkan fragmen ke dalam layout aktivitas dengan mendeklarasikan fragmen dalam file layout aktivitas
     70 , sebagai elemen {@code &lt;fragment&gt;}, atau dari kode aplikasi dengan menambahkannya ke
     71  {@link android.view.ViewGroup} yang ada. Akan tetapi, fragmen tidak harus menjadi bagian dari
     72 layout aktivitas; Anda juga bisa menggunakan fragmen tanpa UI-nya sendiri sebagai pekerja tak terlihat untuk
     73 aktivitas tersebut.</p>
     74 
     75 <p>Dokumen ini menjelaskan cara membangun aplikasi menggunakan fragmen, termasuk
     76 cara fragmen mempertahankan statusnya bila ditambahkan ke back-stack aktivitas, berbagi
     77 kejadian dengan aktivitas, dan fragmen lain dalam aktivitas, berkontribusi pada action-bar
     78 aktivitas, dan lainnya.</p>
     79 
     80 
     81 <h2 id="Design">Filosofi Desain</h2>
     82 
     83 <p>Android memperkenalkan fragmen di Android 3.0 (API level 11), terutama untuk mendukung desain UI yang lebih
     84 dinamis dan fleksibel pada layar besar, seperti tablet. Karena
     85 layar tablet jauh lebih besar daripada layar handset, maka lebih banyak ruang untuk mengombinasikan dan
     86 bertukar komponen UI. Fragmen memungkinkan desain seperti itu tanpa perlu mengelola perubahan
     87 kompleks pada hierarki tampilan. Dengan membagi layout aktivitas menjadi beberapa fragmen, Anda bisa
     88 mengubah penampilan aktivitas saat runtime dan mempertahankan perubahan itu di back-stack
     89 yang dikelola oleh aktivitas.</p>
     90 
     91 <p>Misalnya, aplikasi berita bisa menggunakan satu fragmen untuk menampilkan daftar artikel di
     92 sebelah kiri dan fragmen lainnya untuk menampilkan artikel di sebelah kanan&mdash;kedua fragmen ini muncul di satu
     93 aktivitas, berdampingan, dan masing-masing fragmen memiliki serangkaian metode callback daur hidup dan menangani kejadian input
     94 penggunanya sendiri. Sehingga, sebagai ganti menggunakan satu aktivitas untuk memilih
     95 artikel dan aktivitas lainnya untuk membaca artikel, pengguna bisa memilih artikel dan membaca semuanya dalam
     96 aktivitas yang sama, sebagaimana diilustrasikan dalam layout tablet pada gambar 1.</p>
     97 
     98 <p>Anda harus mendesain masing-masing fragmen sebagai komponen aktivitas modular dan bisa digunakan kembali. Yakni, karena
     99 setiap fragmen mendefinisikan layoutnya dan perilakunya dengan callback daur hidupnya sendiri, Anda bisa memasukkan
    100 satu fragmen dalam banyak aktivitas, sehingga Anda harus mendesainnya untuk digunakan kembali dan mencegah
    101 memanipulasi satu fragmen dari fragmen lain secara langsung. Ini terutama penting karena dengan
    102 fragmen modular Anda bisa mengubah kombinasi fragmen untuk ukuran layar berbeda. Saat mendesain aplikasi
    103 untuk mendukung tablet maupun handset, Anda bisa menggunakan kembali fragmen dalam
    104 konfigurasi layout berbeda untuk mengoptimalkan pengalaman pengguna berdasarkan ruang layar yang tersedia. Misalnya
    105 , pada handset, fragmen mungkin perlu dipisahkan untuk menyediakan UI panel tunggal
    106 bila lebih dari satu yang tidak cocok dalam aktivitas yang sama.</p>
    107 
    108 <img src="{@docRoot}images/fundamentals/fragments.png" alt="" />
    109 <p class="img-caption"><strong>Gambar 1.</strong> Contoh cara dua modul UI yang didefinisikan oleh
    110  fragmen bisa digabungkan ke dalam satu aktivitas untuk desain tablet, namun dipisahkan untuk
    111 desain handset.</p>
    112 
    113 <p>Misalnya&mdash;untuk melanjutkan contoh aplikasi berita&mdash; aplikasi bisa menanamkan
    114 dua fragmen dalam <em>Aktivitas A</em>, saat berjalan pada perangkat berukuran tablet. Akan tetapi, pada
    115 layar berukuran handset, ruang untuk kedua fragmen tidak cukup, sehingga <em>Aktivitas A</em> hanya
    116 menyertakan fragmen untuk daftar artikel, dan saat pengguna memilih artikel,
    117 <em>Aktivitas B</em> akan dimulai, termasuk fragmen kedua untuk membaca artikel. Sehingga, aplikasi mendukung
    118 tablet dan handset dengan menggunakan kembali fragmen dalam kombinasi berbeda, seperti diilustrasikan dalam
    119 gambar 1.</p>
    120 
    121 <p>Untuk informasi selengkapnya tentang mendesain aplikasi menggunakan kombinasi fragmen berbeda
    122 untuk konfigurasi layar berbeda, lihat panduan untuk <a href="{@docRoot}guide/practices/tablets-and-handsets.html">Mendukung Tablet dan Handset</a>.</p>
    123 
    124 
    125 
    126 <h2 id="Creating">Membuat Fragmen</h2>
    127 
    128 <div class="figure" style="width:327px">
    129 <img src="{@docRoot}images/fragment_lifecycle.png" alt="" />
    130 <p class="img-caption"><strong>Gambar 2.</strong> Daur hidup fragmen (saat
    131  aktivitasnya berjalan).</p>
    132 </div>
    133 
    134 <p>Untuk membuat fragmen, Anda harus membuat subkelas {@link android.app.Fragment} (atau
    135 subkelasnya yang ada). Kelas {@link android.app.Fragment} memiliki kode yang mirip seperti
    136 {@link android.app.Activity}. Kelas ini memiliki metode callback yang serupa dengan aktivitas, seperti
    137  {@link android.app.Fragment#onCreate onCreate()}, {@link android.app.Fragment#onStart onStart()},
    138 {@link android.app.Fragment#onPause onPause()}, dan {@link android.app.Fragment#onStop onStop()}. Sebenarnya
    139 , jika Anda mengkonversi aplikasi Android saat ini untuk menggunakan fragmen, Anda mungkin cukup memindahkan
    140 kode dari metode callback aktivitas ke masing-masing metode callback
    141 fragmen.</p>
    142 
    143 <p>Biasanya, Anda harus mengimplementasikan setidaknya metode daur hidup berikut ini:</p>
    144 
    145 <dl>
    146   <dt>{@link android.app.Fragment#onCreate onCreate()}</dt>
    147   <dd>Sistem akan memanggilnya saat membuat fragmen. Dalam implementasi, Anda harus
    148 menginisialisasi komponen penting dari fragmen yang ingin dipertahankan saat fragmen
    149 dihentikan sementara atau dihentikan, kemudian dilanjutkan.</dd>
    150   <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt>
    151   <dd>Sistem akan memanggilnya saat fragmen menggambar antarmuka penggunanya
    152 untuk yang pertama kali. Untuk menggambar UI fragmen, Anda harus mengembalikan {@link android.view.View} dari metode
    153 ini yang menjadi akar layout fragmen. Hasil yang dikembalikan bisa berupa null jika
    154 fragmen tidak menyediakan UI.</dd>
    155   <dt>{@link android.app.Activity#onPause onPause()}</dt>
    156   <dd>Sistem akan memanggil metode ini sebagai indikasi pertama bahwa pengguna sedang meninggalkan
    157 fragmen Anda (walau itu tidak selalu berarti fragmen sedang dimusnahkan). Inilah biasanya tempat Anda
    158 harus mengikat setiap perubahan yang harus dipertahankan selepas sesi pengguna saat ini (karena
    159 pengguna mungkin tidak kembali).</dd>
    160 </dl>
    161 
    162 <p>Kebanyakan aplikasi harus mengimplementasikan setidaknya tiga metode ini untuk setiap fragmen, namun ada
    163 beberapa metode callback lain yang juga harus Anda gunakan untuk menangani berbagai tahap
    164 daur hidup fragmen. Semua metode callback daur hidup akan dibahas secara lebih detail, di bagian
    165 tentang <a href="#Lifecycle">Menangani Daur Hidup Fragmen</a>.</p>
    166 
    167 
    168 <p>Ada juga beberapa subkelas yang mungkin ingin diperpanjang, sebagai ganti kelas basis {@link
    169 android.app.Fragment}:</p>
    170 
    171 <dl>
    172   <dt>{@link android.app.DialogFragment}</dt>
    173   <dd>Menampilkan dialog mengambang. Penggunaan kelas ini untuk membuat dialog merupakan alternatif yang baik dari
    174 penggunaan metode helper dialog di kelas {@link android.app.Activity}, karena Anda bisa
    175 menyatukan dialog fragmen ke dalam back-stack fragmen yang dikelola oleh aktivitas,
    176 sehingga pengguna bisa kembali ke fragmen yang ditinggalkan.</dd>
    177 
    178   <dt>{@link android.app.ListFragment}</dt>
    179   <dd>Menampilkan daftar item yang dikelola oleh adaptor (seperti {@link
    180 android.widget.SimpleCursorAdapter}), serupa dengan {@link android.app.ListActivity}. Menampilkan
    181 beberapa metode pengelolaan daftar tampilan seperti callback {@link
    182 android.app.ListFragment#onListItemClick(ListView,View,int,long) onListItemClick()} untuk
    183 menangani kejadian klik.</dd>
    184 
    185   <dt>{@link android.preference.PreferenceFragment}</dt>
    186   <dd>Menampilkan hierarki objek {@link android.preference.Preference} sebagai daftar, serupa dengan
    187 {@link android.preference.PreferenceActivity}. Hal ini berguna saat membuat aktivitas
    188 "pengaturan" untuk aplikasi Anda.</dd>
    189 </dl>
    190 
    191 
    192 <h3 id="UI">Menambahkan antarmuka pengguna</h3>
    193 
    194 <p>Fragmen biasanya digunakan sebagai bagian dari antarmuka pengguna aktivitas dan menyumbangkan
    195 layoutnya sendiri ke aktivitas.</p>
    196 
    197 <p>Untuk menyediakan layout fragmen, Anda harus mengimplementasikan metode callback {@link
    198 android.app.Fragment#onCreateView onCreateView()}, yang dipanggil sistem Android
    199 bila tiba saatnya fragmen menggambar layoutnya. Implementasi Anda atas metode ini harus mengembalikan
    200 {@link android.view.View} yang menjadi akar layout fragmen.</p>
    201 
    202 <p class="note"><strong>Catatan:</strong> Jika fragmen adalah subkelas {@link
    203 android.app.ListFragment}, implementasi default akan mengembalikan {@link android.widget.ListView} dari
    204 {@link android.app.Fragment#onCreateView onCreateView()}, sehingga Anda tidak perlu mengimplementasikannya.</p>
    205 
    206 <p>Untuk mengembalikan layout dari {@link
    207 android.app.Fragment#onCreateView onCreateView()}, Anda bisa memekarkannya dari <a href="{@docRoot}guide/topics/resources/layout-resource.html">sumber daya layout</a> yang didefinisikan di XML. Untuk
    208 membantu melakukannya, {@link android.app.Fragment#onCreateView onCreateView()} menyediakan objek
    209 {@link android.view.LayoutInflater}.</p>
    210 
    211 <p>Misalnya, ini adalah subkelas {@link android.app.Fragment} yang memuat layout dari file
    212 {@code example_fragment.xml}:</p>
    213 
    214 <pre>
    215 public static class ExampleFragment extends Fragment {
    216     &#64;Override
    217     public View onCreateView(LayoutInflater inflater, ViewGroup container,
    218                              Bundle savedInstanceState) {
    219         // Inflate the layout for this fragment
    220         return inflater.inflate(R.layout.example_fragment, container, false);
    221     }
    222 }
    223 </pre>
    224 
    225 <div class="sidebox-wrapper">
    226 <div class="sidebox">
    227   <h3>Membuat layout</h3>
    228   <p>Dalam contoh di atas, {@code R.layout.example_fragment} merupakan acuan ke sumber daya layout
    229 bernama {@code example_fragment.xml} yang tersimpan dalam sumber daya aplikasi. Untuk informasi tentang cara
    230 membuat layout di XML, lihat dokumentasi
    231 <a href="{@docRoot}guide/topics/ui/index.html">Antarmuka Pengguna</a>.</p>
    232 </div>
    233 </div>
    234 
    235 <p>Parameter {@code container} yang diteruskan ke {@link android.app.Fragment#onCreateView
    236 onCreateView()} adalah induk {@link android.view.ViewGroup} (dari layout aktivitas) tempat
    237 layout fragmen
    238 akan disisipkan. Parameter {@code savedInstanceState} adalah {@link android.os.Bundle} yang
    239 menyediakan data tentang instance fragmen sebelumnya, jika fragmen dilanjutkan
    240 (status pemulihan dibahas selengkapnya di bagian tentang <a href="#Lifecycle">Menangani
    241 Daur Hidup Fragmen</a>).</p>
    242 
    243 <p>Metode {@link android.view.LayoutInflater#inflate(int,ViewGroup,boolean) inflate()} membutuhkan
    244 tiga argumen:</p>
    245 <ul>
    246   <li>ID sumber daya layout yang ingin dimekarkan.</li>
    247   <li>{@link android.view.ViewGroup} akan menjadi induk dari layout yang dimekarkan. {@code
    248 container} perlu diteruskan agar sistem menerapkan parameter layout ke tampilan akar layout
    249 yang dimekarkan, yang ditetapkan dalam tampilan induk yang akan dituju.</li>
    250   <li>Boolean yang menunjukkan apakah layout akan dimekarkan harus ditempelkan pada {@link
    251 android.view.ViewGroup} (parameter kedua) selama pemekaran. (Dalam hal ini, ini
    252 salah karena sistem sudah memasukkan layout yang dimekarkan ke dalam {@code
    253 container}&mdash;meneruskan benar akan membuat tampilan grup yang berlebihan dalam layout akhir.)</li>
    254 </ul>
    255 
    256 <p>Anda kini telah melihat cara membuat fragmen yang menyediakan layout. Berikutnya, Anda perlu menambahkan
    257 fragmen ke aktivitas.</p>
    258 
    259 
    260 
    261 <h3 id="Adding">Menambahkan fragmen ke aktivitas</h3>
    262 
    263 <p>Biasanya, fragmen berkontribusi pada sebagian UI ke aktivitas host, yang ditanamkan sebagai
    264 bagian dari hierarki tampilan keseluruhan aktivitas. Ada dua cara untuk menambahkan fragmen ke layout
    265 aktivitas:</p>
    266 
    267 <ul>
    268   <li><b>Deklarasikan fragmen dalam file layout aktivitas.</b>
    269 <p>Dalam hal ini, Anda bisa
    270 menetapkan properti layout fragmen seakan-akan sebuah tampilan. Misalnya, berikut ini adalah file
    271 layout untuk aktivitas dengan dua fragmen:</p>
    272 <pre>
    273 &lt;?xml version="1.0" encoding="utf-8"?&gt;
    274 &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    275     android:orientation="horizontal"
    276     android:layout_width="match_parent"
    277     android:layout_height="match_parent"&gt;
    278     &lt;fragment android:name="com.example.news.ArticleListFragment"
    279             android:id="@+id/list"
    280             android:layout_weight="1"
    281             android:layout_width="0dp"
    282             android:layout_height="match_parent" /&gt;
    283     &lt;fragment android:name="com.example.news.ArticleReaderFragment"
    284             android:id="@+id/viewer"
    285             android:layout_weight="2"
    286             android:layout_width="0dp"
    287             android:layout_height="match_parent" /&gt;
    288 &lt;/LinearLayout&gt;
    289 </pre>
    290   <p>Atribut {@code android:name} dalam {@code &lt;fragment&gt;} menetapkan kelas {@link
    291 android.app.Fragment} untuk dibuat instance-nya dalam layout.</p>
    292 
    293 <p>Saat sistem membuat layout aktivitas, sistem membuat instance setiap fragmen sebagaimana yang ditetapkan dalam layout
    294 dan memanggil metode {@link android.app.Fragment#onCreateView onCreateView()} masing-masing,
    295 untuk mengambil setiap fragmen. Sistem akan menyisipkan {@link android.view.View} yang dikembalikan langsung oleh fragmen,
    296  menggantikan elemen {@code &lt;fragment&gt;}.</p>
    297 
    298 <div class="note">
    299   <p><strong>Catatan:</strong> Setiap fragmen memerlukan identifier
    300 unik yang bisa digunakan sistem untuk memulihkan fragmen jika aktivitas dimulai kembali (dan identifier yang bisa digunakan menangkap
    301 fragmen untuk melakukan transaksi, seperti menghapusnya). Ada tiga cara untuk memberikan
    302 ID bagi fragmen:</p>
    303   <ul>
    304     <li>Memberikan atribut {@code android:id} bersama ID unik.</li>
    305     <li>Memberikan atribut {@code android:tag} bersama string unik.</li>
    306     <li>Jika Anda tidak memberikan dua hal tersebut, sistem akan menggunakan ID
    307 tampilan kontainer.</li>
    308   </ul>
    309 </div>
    310   </li>
    311 
    312   <li><b>Atau, secara programatis tambahkan fragmen ke {@link android.view.ViewGroup} yang ada.</b>
    313 <p>Kapan saja saat aktivitas berjalan, Anda bisa menambahkan fragmen ke layout aktivitas. Anda
    314 cukup menetapkan {@link
    315 android.view.ViewGroup} di tempat memasukkan fragmen.</p>
    316   <p>Untuk membuat transaksi fragmen dalam aktivitas (seperti menambah, menghapus, atau mengganti
    317 fragmen), Anda harus menggunakan API dari {@link android.app.FragmentTransaction}. Anda bisa mengambil instance
    318  {@link android.app.FragmentTransaction} dari {@link android.app.Activity} seperti ini:</p>
    319 
    320 <pre>
    321 FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()}
    322 FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()};
    323 </pre>
    324 
    325 <p>Selanjutnya Anda bisa menambahkan fragmen menggunakan metode {@link
    326 android.app.FragmentTransaction#add(int,Fragment) add()}, dengan menetapkan fragmen yang akan ditambahkan dan
    327 tampilan tempat menyisipkannya. Misalnya:</p>
    328 
    329 <pre>
    330 ExampleFragment fragment = new ExampleFragment();
    331 fragmentTransaction.add(R.id.fragment_container, fragment);
    332 fragmentTransaction.commit();
    333 </pre>
    334 
    335   <p>Argumen pertama yang diteruskan ke {@link android.app.FragmentTransaction#add(int,Fragment) add()}
    336  adalah {@link android.view.ViewGroup} tempat fragmen harus dimasukkan, yang ditetapkan oleh
    337 ID sumber daya, dan parameter kedua merupakan fragmen yang akan ditambahkan.</p>
    338   <p>Setelah membuat perubahan dengan
    339 {@link android.app.FragmentTransaction}, Anda harus
    340  memanggil {@link android.app.FragmentTransaction#commit} untuk menerapkan perubahan.</p>
    341   </li>
    342 </ul>
    343 
    344 
    345 <h4 id="AddingWithoutUI">Menambahkan fragmen tanpa UI</h4>
    346 
    347 <p>Contoh di atas menampilkan cara menambahkan fragmen ke aktivitas untuk menyediakan UI. Akan tetapi,
    348 Anda juga bisa menggunakan fragmen untuk menyediakan perilaku latar belakang bagi aktivitas tanpa menampilkan UI
    349 tambahan.</p>
    350 
    351 <p>Untuk menambahkan fragmen tanpa UI, tambahkan fragmen dari aktivitas menggunakan {@link
    352 android.app.FragmentTransaction#add(Fragment,String)} (dengan menyediakan string unik "tag" untuk fragmen
    353 , bukan ID tampilan). Ini akan menambahkan fragmen, namun, karena tidak dikaitkan dengan tampilan
    354 dalam layout aktivitas, ini tidak akan menerima panggilan ke {@link
    355 android.app.Fragment#onCreateView onCreateView()}. Jadi Anda tidak perlu mengimplementasikan metode itu.</p>
    356 
    357 <p>Menyediakan tag string untuk fragmen tidak hanya untuk fragmen non-UI&mdash;Anda juga bisa
    358 menyediakan tag string untuk fragmen yang memiliki UI&mdash;namun jika fragmen tidak memiliki UI
    359 , maka tag string adalah satu-satunya cara untuk mengidentifikasinya. Jika Anda ingin mendapatkan fragmen dari
    360 aktivitas nantinya, Anda perlu menggunakan {@link android.app.FragmentManager#findFragmentByTag
    361 findFragmentByTag()}.</p>
    362 
    363 <p>Untuk contoh aktivitas yang menggunakan fragmen sebagai pekerja latar belakang, tanpa UI, lihat sampel {@code
    364 FragmentRetainInstance.java}, yang disertakan dalam sampel SDK (tersedia melalui
    365 Android SDK Manager) dan terletak di sistem Anda sebagai
    366 <code>&lt;sdk_root&gt;/APIDemos/app/src/main/java/com/example/android/apis/app/FragmentRetainInstance.java</code>.</p>
    367 
    368 
    369 
    370 <h2 id="Managing">Mengelola Fragmen</h2>
    371 
    372 <p>Untuk mengelola fragmen dalam aktivitas, Anda perlu menggunakan {@link android.app.FragmentManager}. Untuk
    373 mendapatkannya, panggil {@link android.app.Activity#getFragmentManager()} dari aktivitas Anda.</p>
    374 
    375 <p>Beberapa hal yang dapat Anda lakukan dengan {@link android.app.FragmentManager} antara lain:</p>
    376 
    377 <ul>
    378   <li>Dapatkan fragmen yang ada di aktivitas dengan {@link
    379 android.app.FragmentManager#findFragmentById findFragmentById()} (untuk fragmen yang menyediakan UI dalam
    380 layout aktivitas) atau {@link android.app.FragmentManager#findFragmentByTag
    381 findFragmentByTag()} (untuk fragmen yang menyediakan atau tidak menyediakan UI).</li>
    382   <li>Tarik fragmen dari back-stack, dengan {@link
    383 android.app.FragmentManager#popBackStack()} (mensimulasikan perintah <em>Back</em> oleh pengguna).</li>
    384   <li>Daftarkan listener untuk perubahan pada back-stack, dengan {@link
    385 android.app.FragmentManager#addOnBackStackChangedListener addOnBackStackChangedListener()}.</li>
    386 </ul>
    387 
    388 <p>Untuk informasi selengkapnya tentang metode ini dan hal lainnya, lihat dokumentasi kelas {@link
    389 android.app.FragmentManager}.</p>
    390 
    391 <p>Seperti yang ditunjukkan di bagian sebelumnya, Anda juga bisa menggunakan {@link android.app.FragmentManager}
    392 untuk membuka {@link android.app.FragmentTransaction}, sehingga Anda bisa melakukan transaksi, seperti
    393 menambah dan menghapus fragmen.</p>
    394 
    395 
    396 <h2 id="Transactions">Melakukan Transaksi Fragmen</h2>
    397 
    398 <p>Fitur menarik terkait penggunaan fragmen di aktivitas adalah kemampuan menambah, menghapus, mengganti,
    399 dan melakukan tindakan lain dengannya, sebagai respons atas interaksi pengguna. Setiap set perubahan
    400 yang Anda lakukan untuk aktivitas disebut transaksi dan Anda bisa melakukan transaksi menggunakan API di {@link
    401 android.app.FragmentTransaction}. Anda juga bisa menyimpan setiap transaksi ke back-stack yang dikelola
    402 aktivitas, sehingga pengguna bisa mengarah mundur melalui perubahan fragmen (mirip mengarah
    403 mundur melalui aktivitas).</p>
    404 
    405 <p>Anda bisa mengambil instance {@link android.app.FragmentTransaction} dari {@link
    406 android.app.FragmentManager} seperti ini:</p>
    407 
    408 <pre>
    409 FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()};
    410 FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()};
    411 </pre>
    412 
    413 <p>Setiap transaksi merupakan serangkaian perubahan yang ingin dilakukan pada waktu yang sama. Anda bisa
    414 mengatur semua perubahan yang ingin dilakukan untuk transaksi mana saja menggunakan metode seperti {@link
    415 android.app.FragmentTransaction#add add()}, {@link android.app.FragmentTransaction#remove remove()},
    416 dan {@link android.app.FragmentTransaction#replace replace()}. Kemudian, untuk menerapkan transaksi
    417 pada aktivitas, Anda harus memanggil {@link android.app.FragmentTransaction#commit()}.</p>
    418 </dl>
    419 
    420 <p>Akan tetapi, sebelum memanggil {@link
    421 android.app.FragmentTransaction#commit()}, Anda mungkin perlu memanggil {@link
    422 android.app.FragmentTransaction#addToBackStack addToBackStack()}, untuk menambahkan transaksi
    423 ke back-stack dari transaksi fragmen. Back-stack ini dikelola oleh aktivitas dan memungkinkan
    424 pengguna kembali ke status fragmen sebelumnya, dengan menekan tombol <em>Back</em>.</p>
    425 
    426 <p>Misalnya, berikut ini cara mengganti satu fragmen dengan yang fragmen yang lain, dan mempertahankan
    427 status sebelumnya di back-stack:</p>
    428 
    429 <pre>
    430 // Create new fragment and transaction
    431 Fragment newFragment = new ExampleFragment();
    432 FragmentTransaction transaction = getFragmentManager().beginTransaction();
    433 
    434 // Replace whatever is in the fragment_container view with this fragment,
    435 // and add the transaction to the back stack
    436 transaction.replace(R.id.fragment_container, newFragment);
    437 transaction.addToBackStack(null);
    438 
    439 // Commit the transaction
    440 transaction.commit();
    441 </pre>
    442 
    443 <p>Dalam contoh ini, {@code newFragment} menggantikan fragmen apa saja (jika ada) yang saat ini berada dalam
    444 kontainer layout yang diidentifikasi oleh ID {@code R.id.fragment_container}. Dengan memanggil @link
    445 android.app.FragmentTransaction#addToBackStack addToBackStack()}, transaksi yang diganti
    446 disimpan ke back-stack sehingga pengguna bisa membalikkan transaksi dan mengembalikan fragmen
    447 sebelumnya dengan menekan tombol <em>Back</em>.</p>
    448 
    449 <p>Jika Anda menambahkan beberapa perubahan pada transaksi (seperti {@link
    450 android.app.FragmentTransaction#add add()} atau {@link android.app.FragmentTransaction#remove
    451 remove()}) dan panggil {@link
    452 android.app.FragmentTransaction#addToBackStack addToBackStack()}, maka semua perubahan akan diterapkan
    453 sebelum Anda memanggil {@link android.app.FragmentTransaction#commit commit()} akan ditambahkan ke
    454 back-stack sebagai satu transaksi dan tombol <em>Back</em> akan membalikannya semua.</p>
    455 
    456 <p>Urutan menambahkan perubahan pada {@link android.app.FragmentTransaction} tidak berpengaruh,
    457 kecuali:</p>
    458 <ul>
    459   <li>Anda harus memanggil {@link android.app.FragmentTransaction#commit()} paling akhir</li>
    460   <li>Jika Anda menambahkan beberapa fragmen ke kontainer yang sama, maka
    461 urutan penambahannya akan menentukan urutan munculnya dalam hierarki tampilan</li>
    462 </ul>
    463 
    464 <p>Jika Anda tidak memanggil {@link android.app.FragmentTransaction#addToBackStack(String)
    465 addToBackStack()} saat melakukan transaksi yang menghapus fragmen, maka fragmen itu
    466 akan dimusnahkan bila transaksi diikat dan pengguna tidak bisa mengarah kembali ke sana. Sedangkan, jika
    467 Anda memanggil {@link android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} saat
    468 menghapus fragmen, maka fragmen itu akan <em>dihentikan</em> dan akan dilanjutkan jika pengguna mengarah
    469 kembali.</p>
    470 
    471 <p class="note"><strong>Tip:</strong> Untuk setiap transaksi fragmen, Anda bisa menerapkan animasi
    472 transisi, dengan memanggil {@link android.app.FragmentTransaction#setTransition setTransition()} sebelum
    473 mengikatnya.</p>
    474 
    475 <p>Memanggil {@link android.app.FragmentTransaction#commit()} tidak akan langsung menjalankan
    476 transaksi. Namun sebuah jadwal akan dibuat untuk dijalankan pada thread UI aktivitas (thread "utama")
    477 begitu thread bisa melakukannya. Akan tetapi, jika perlu Anda bisa memanggil {@link
    478 android.app.FragmentManager#executePendingTransactions()} dari thread UI untuk segera
    479 mengeksekusi transaksi yang diserahkan oleh {@link android.app.FragmentTransaction#commit()}. Hal itu
    480 biasanya tidak perlu kecuali jika transaksi merupakan dependensi bagi pekerjaan dalam thread lain.</p>
    481 
    482 <p class="caution"><strong>Perhatian:</strong> Anda bisa mengikat transaksi menggunakan {@link
    483 android.app.FragmentTransaction#commit commit()} hanya sebelum aktivitas <a href="{@docRoot}guide/components/activities.html#SavingActivityState">menyimpan
    484 statusnya</a> (saat pengguna meninggalkan aktivitas). Jika Anda mencoba mengikatnya setelah itu,
    485 eksepsi akan dilontarkan. Ini karena status setelah pengikatan bisa hilang jika aktivitas
    486 perlu dipulihkan. Untuk situasi yang memperbolehkan Anda meniadakan pengikatan (commit), gunakan {@link
    487 android.app.FragmentTransaction#commitAllowingStateLoss()}.</p>
    488 
    489 
    490 
    491 
    492 <h2 id="CommunicatingWithActivity">Berkomunikasi dengan Aktivitas</h2>
    493 
    494 <p>Meskipun {@link android.app.Fragment} diimplementasikan sebagai objek yang tidak bergantung pada
    495 {@link android.app.Activity} dan bisa digunakan dalam banyak aktivitas, instance tertentu
    496 dari fragmen secara langsung terkait dengan aktivitas yang dimuatnya.</p>
    497 
    498 <p>Khususnya, fragmen bisa mengakses instance {@link android.app.Activity} dengan {@link
    499 android.app.Fragment#getActivity()} dan dengan mudah melakukan tugas-tugas seperti mencari tampilan dalam
    500  layout aktivitas:</p>
    501 
    502 <pre>
    503 View listView = {@link android.app.Fragment#getActivity()}.{@link android.app.Activity#findViewById findViewById}(R.id.list);
    504 </pre>
    505 
    506 <p>Demikian pula, aktivitas Anda bisa memanggil metode di fragmen dengan meminta acuan ke
    507 {@link android.app.Fragment} dari {@link android.app.FragmentManager}, menggunakan {@link
    508 android.app.FragmentManager#findFragmentById findFragmentById()} atau {@link
    509 android.app.FragmentManager#findFragmentByTag findFragmentByTag()}. Misalnya:</p>
    510 
    511 <pre>
    512 ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
    513 </pre>
    514 
    515 
    516 <h3 id="EventCallbacks">Membuat callback kejadian pada aktivitas</h3>
    517 
    518 <p>Dalam beberapa kasus, Anda mungkin perlu fragmen untuk berbagi kejadian dengan aktivitas. Cara yang baik untuk melakukannya
    519 adalah mendefinisikan antarmuka callback di dalam fragmen dan mengharuskan aktivitas host
    520 mengimplementasikannya. Saat aktivitas menerima callback melalui antarmuka, aktivitas akan bisa berbagi informasi itu
    521 dengan fragmen lain dalam layout jika perlu.</p>
    522 
    523 <p>Misalnya, jika sebuah aplikasi berita memiliki dua fragmen dalam aktivitas&mdash;satu untuk menampilkan daftar
    524 artikel (fragmen A) dan satu lagi untuk menampilkan artikel (fragmen B)&mdash;maka fragmen A harus
    525 memberi tahu aktivitas bila item daftar dipilih sehingga aktivitas bisa memberi tahu fragmen B untuk menampilkan artikel. Dalam
    526 hal ini, antarmuka {@code OnArticleSelectedListener} dideklarasikan di dalam fragmen A:</p>
    527 
    528 <pre>
    529 public static class FragmentA extends ListFragment {
    530     ...
    531     // Container Activity must implement this interface
    532     public interface OnArticleSelectedListener {
    533         public void onArticleSelected(Uri articleUri);
    534     }
    535     ...
    536 }
    537 </pre>
    538 
    539 <p>Selanjutnya aktivitas yang menjadi host fragmen akan mengimplementasikan antarmuka {@code OnArticleSelectedListener}
    540  dan
    541 mengesampingkan {@code onArticleSelected()} untuk memberi tahu fragmen B mengenai kejadian dari fragmen A. Untuk memastikan
    542 bahwa aktivitas host mengimplementasikan antarmuka ini, metode callback fragmen A {@link
    543 android.app.Fragment#onAttach onAttach()} (yang dipanggil sistem saat menambahkan
    544 fragmen ke aktivitas) membuat instance {@code OnArticleSelectedListener} dengan
    545 membuat {@link android.app.Activity} yang diteruskan ke {@link android.app.Fragment#onAttach
    546 onAttach()}:</p>
    547 
    548 <pre>
    549 public static class FragmentA extends ListFragment {
    550     OnArticleSelectedListener mListener;
    551     ...
    552     &#64;Override
    553     public void onAttach(Activity activity) {
    554         super.onAttach(activity);
    555         try {
    556             mListener = (OnArticleSelectedListener) activity;
    557         } catch (ClassCastException e) {
    558             throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
    559         }
    560     }
    561     ...
    562 }
    563 </pre>
    564 
    565 <p>Jika aktivitas belum mengimplementasikan antarmuka, maka fragmen akan melontarkan
    566 {@link java.lang.ClassCastException}.
    567 Jika berhasil, anggota {@code mListener} yang menyimpan acuan ke implementasi aktivitas
    568 {@code OnArticleSelectedListener}, sehingga fragmen A bisa berbagi kejadian dengan aktivitas, dengan memanggil metode
    569 yang didefinisikan oleh antarmuka {@code OnArticleSelectedListener}. Misalnya, jika fragmen A adalah
    570 ekstensi dari {@link android.app.ListFragment}, maka setiap kali
    571 pengguna mengklik item daftar, sistem akan memanggil {@link android.app.ListFragment#onListItemClick
    572 onListItemClick()} di fragmen, yang selanjutnya memanggil {@code onArticleSelected()} untuk berbagi
    573 kejadian dengan aktivitas:</p>
    574 
    575 <pre>
    576 public static class FragmentA extends ListFragment {
    577     OnArticleSelectedListener mListener;
    578     ...
    579     &#64;Override
    580     public void onListItemClick(ListView l, View v, int position, long id) {
    581         // Append the clicked item's row ID with the content provider Uri
    582         Uri noteUri = ContentUris.{@link android.content.ContentUris#withAppendedId withAppendedId}(ArticleColumns.CONTENT_URI, id);
    583         // Send the event and Uri to the host activity
    584         mListener.onArticleSelected(noteUri);
    585     }
    586     ...
    587 }
    588 </pre>
    589 
    590 <p>Parameter {@code id} yang diteruskan ke {@link
    591 android.app.ListFragment#onListItemClick onListItemClick()} merupakan ID baris dari item yang diklik,
    592 yang digunakan aktivitas (atau fragmen lain) untuk mengambil artikel dari {@link
    593 android.content.ContentProvider} aplikasi.</p>
    594 
    595 <p><!--To see a complete implementation of this kind of callback interface, see the <a
    596 href="{@docRoot}resources/samples/NotePad/index.html">NotePad sample</a>. -->Informasi selengkapnya tentang
    597 menggunakan penyedia konten tersedia dalam dokumen <a href="{@docRoot}guide/topics/providers/content-providers.html">Penyedia Konten</a>.</p>
    598 
    599 
    600 
    601 <h3 id="ActionBar">Menambahkan item ke Action-Bar</h3>
    602 
    603 <p>Fragmen Anda bisa menyumbangkan item menu ke <a href="{@docRoot}guide/topics/ui/menus.html#options-menu">Menu Opsi</a> aktivitas (dan, konsekuensinya, <a href="{@docRoot}guide/topics/ui/actionbar.html">Action-Bar</a>) dengan mengimplementasikan
    604 {@link android.app.Fragment#onCreateOptionsMenu(Menu,MenuInflater) onCreateOptionsMenu()}. Agar
    605 metode ini bisa menerima panggilan, Anda harus memanggil {@link
    606 android.app.Fragment#setHasOptionsMenu(boolean) setHasOptionsMenu()} selama {@link
    607 android.app.Fragment#onCreate(Bundle) onCreate()}, untuk menunjukkan bahwa fragmen
    608 ingin menambahkan item ke Menu Opsi (jika tidak, fragmen tidak akan menerima panggilan ke
    609 {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()}).</p>
    610 
    611 <p>Setiap item yang selanjutnya Anda tambahkan ke Menu Opsi dari fragmen akan ditambahkan ke item menu
    612 yang ada. Fragmen juga menerima callback ke {@link
    613 android.app.Fragment#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} bila item menu
    614 dipilih.</p>
    615 
    616 <p>Anda juga bisa mendaftarkan tampilan dalam layout fragmen untuk menyediakan menu konteks dengan memanggil {@link
    617 android.app.Fragment#registerForContextMenu(View) registerForContextMenu()}. Bila pengguna
    618 membuka menu konteks, fragmen akan menerima panggilan ke {@link
    619 android.app.Fragment#onCreateContextMenu(ContextMenu,View,ContextMenu.ContextMenuInfo)
    620 onCreateContextMenu()}. Bila pengguna memilih item, fragmen akan menerima panggilan ke @link
    621 android.app.Fragment#onContextItemSelected(MenuItem) onContextItemSelected()}.</p>
    622 
    623 <p class="note"><strong>Catatan:</strong> Walaupun fragmen menerima callback pada item yang dipilih
    624 untuk setiap item menu yang ditambahkannya, aktivitaslah yang pertama kali menerima masing-masing callback saat pengguna
    625 memilih item menu. Jika implementasi aktivitas dari callback bila-item-dipilih,
    626 tidak menangani item yang dipilih, maka kejadian akan diteruskan ke callback fragmen. Ini berlaku
    627 untuk Menu Opsi dan menu konteks.</p>
    628 
    629 <p>Untuk informasi selengkapnya tentang menu, lihat panduan pengembang <a href="{@docRoot}guide/topics/ui/menus.html">Menu</a> dan <a href="{@docRoot}guide/topics/ui/actionbar.html">Action-Bar</a>.</p>
    630 
    631 
    632 
    633 
    634 <h2 id="Lifecycle">Menangani Daur Hidup Fragmen</h2>
    635 
    636 <div class="figure" style="width:350px">
    637 <img src="{@docRoot}images/activity_fragment_lifecycle.png" alt="" />
    638 <p class="img-caption"><strong>Gambar 3.</strong> Efek daur hidup aktivitas pada daur hidup
    639 fragmen.</p>
    640 </div>
    641 
    642 <p>Mengelola daur hidup fragmen mirip sekali dengan mengelola daur hidup aktivitas. Seperti
    643 aktivitas, fragmen bisa berada dalam tiga status:</p>
    644 
    645 <dl>
    646   <dt><i>Dilanjutkan</i></dt>
    647     <dd>Fragmen terlihat dalam aktivitas yang berjalan.</dd>
    648 
    649   <dt><i>Dihentikan sementara</i></dt>
    650     <dd>Aktivitas lain berada di latar depan dan memiliki fokus, namun aktivitas tempat fragmen berada
    651 masih terlihat (aktivitas latar depan sebagian terlihat atau tidak menutupi
    652 seluruh layar).</dd>
    653 
    654   <dt><i>Dihentikan</i></dt>
    655     <dd>Fragmen tidak terlihat. Aktivitas host telah dihentikan atau
    656 fragmen telah dihapus dari aktivitas namun ditambahkan ke back-stack. Fragmen yang dihentikan
    657 masih hidup (semua status dan informasi anggota masih disimpan oleh sistem). Akan tetapi, fragmen
    658 tidak terlihat lagi oleh pengguna dan akan dimatikan jika aktivitas dimatikan.</dd>
    659 </dl>
    660 
    661 <p>Seperti halnya aktivitas, Anda bisa mempertahankan status fragmen menggunakan {@link
    662 android.os.Bundle}, jika proses aktivitas dimatikan dan Anda harus memulihkan status
    663 fragmen bila aktivitas dibuat kembali. Anda bisa menyimpan status selama callback {@link
    664 android.app.Fragment#onSaveInstanceState onSaveInstanceState()} fragmen dan memulihkannya selama
    665 {@link android.app.Fragment#onCreate onCreate()}, {@link
    666 android.app.Fragment#onCreateView onCreateView()}, atau {@link
    667 android.app.Fragment#onActivityCreated onActivityCreated()}. Untuk informasi selengkapnya tentang menyimpan
    668 status, lihat dokumen <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Aktivitas</a>
    669 .</p>
    670 
    671 <p>Perbedaan paling signifikan dalam daur hidup antara aktivitas dan fragmen ada
    672 pada cara penyimpanannya dalam back-stack masing-masing. Aktivitas ditempatkan ke back-stack aktivitas
    673 yang dikelola oleh sistem saat dihentikan, secara default (sehingga pengguna bisa mengarah kembali
    674 ke aktivitas dengan tombol <em>Back</em>, seperti yang dibahas dalam <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tugas dan Back-Stack</a>).
    675 Akan tetapi, fragmen yang ditempatkan ke back-stack dikelola oleh aktivitas host hanya saat
    676 Anda secara eksplisit meminta agar instance disimpan dengan memanggil {@link
    677 android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} selama transaksi yang
    678 menghapus fragmen.</p>
    679 
    680 <p>Jika tidak, pengelolaan daur hidup fragmen mirip sekali dengan mengelola daur hidup
    681 aktivitas. Jadi, praktik yang sama untuk <a href="{@docRoot}guide/components/activities.html#Lifecycle">mengelola daur hidup
    682 aktivitas</a> juga berlaku untuk fragmen. Namun yang perlu juga Anda pahami adalah bagaimana hidup
    683 aktivitas memengaruhi hidup fragmen.</p>
    684 
    685 <p class="caution"><strong>Perhatian:</strong> Jika Anda memerlukan objek {@link android.content.Context}
    686  dalam {@link android.app.Fragment}, Anda bisa memanggil {@link android.app.Fragment#getActivity()}.
    687 Akan tetapi, berhati-hatilah memanggil {@link android.app.Fragment#getActivity()} hanya bila fragmen
    688 terkait dengan aktivitas. Bila fragmen belum terkait, atau terlepas selama akhir daur
    689 hidupnya, {@link android.app.Fragment#getActivity()} akan kembali nol.</p>
    690 
    691 
    692 <h3 id="CoordinatingWithActivity">Mengoordinasi dengan daur hidup aktivitas</h3>
    693 
    694 <p>Daur hidup aktivitas tempat fragmen berada akan memengaruhi langsung siklus hidup
    695 fragmen sedemikian rupa sehingga setiap callback daur hidup aktivitas menghasilkan callback yang sama untuk masing-masing
    696 fragmen. Misalnya, bila aktivitas menerima {@link android.app.Activity#onPause}, masing-masing
    697 fragmen dalam aktivitas akan menerima {@link android.app.Fragment#onPause}.</p>
    698 
    699 <p>Namun fragmen memiliki beberapa callback daur hidup ekstra, yang menangani interaksi
    700 unik dengan aktivitas untuk melakukan tindakan seperti membangun dan memusnahkan UI fragmen. Metode callback
    701 tambahan ini adalah:</p>
    702 
    703 <dl>
    704   <dt>{@link android.app.Fragment#onAttach onAttach()}</dt>
    705     <dd>Dipanggil bila fragmen telah dikaitkan dengan aktivitas ({@link
    706 android.app.Activity} diteruskan di sini).</dd>
    707   <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt>
    708     <dd>Dipanggil untuk membuat hierarki tampilan yang dikaitkan dengan fragmen.</dd>
    709   <dt>{@link android.app.Fragment#onActivityCreated onActivityCreated()}</dt>
    710     <dd>Dipanggil bila metode {@link android.app.Activity#onCreate
    711 onCreate()} aktivitas telah dikembalikan.</dd>
    712   <dt>{@link android.app.Fragment#onDestroyView onDestroyView()}</dt>
    713     <dd>Dipanggil bila hierarki tampilan yang terkait dengan fragmen dihapus.</dd>
    714   <dt>{@link android.app.Fragment#onDetach onDetach()}</dt>
    715     <dd>Dipanggil bila fragmen diputuskan dari aktivitas.</dd>
    716 </dl>
    717 
    718 <p>Aliran daur hidup fragmen, karena dipengaruhi oleh aktivitas host-nya, diilustrasikan oleh
    719 gambar 3. Dalam gambar ini, Anda bisa melihat bagaimana setiap status aktivitas menentukan
    720 metode callback mana yang mungkin diterima fragmen. Misalnya, saat aktivitas menerima call back {@link
    721 android.app.Activity#onCreate onCreate()}, fragmen dalam aktivitas akan menerima tidak lebih
    722 dari callback {@link android.app.Fragment#onActivityCreated onActivityCreated()}.</p>
    723 
    724 <p>Setelah status aktivitas diteruskan kembali, Anda bisa bebas menambah dan menghapus fragmen untuk
    725 aktivitas tersebut. Sehingga, hanya saat aktivitas berada dalam status dilanjutkan, daur hidup fragmen bisa
    726 berubah secara independen.</p>
    727 
    728 <p>Akan tetapi, saat aktivitas meninggalkan status dilanjutkan, fragmen akan kembali didorong
    729 melalui daur hidupnya oleh aktivitas.</p>
    730 
    731 
    732 
    733 
    734 <h2 id="Example">Contoh</h2>
    735 
    736 <p>Untuk merangkum semua yang telah dibahas dalam dokumen ini, berikut ini contoh aktivitas
    737 yang menggunakan dua fragmen untuk membuat layout dua panel. Aktivitas di bawah ini menyertakan satu fragmen untuk
    738 menampilkan daftar putar Shakespeare dan fragmen lainnya menampilkan rangkuman pemutaran bila dipilih dari
    739 daftar. Aktivitas ini juga menunjukkan cara menyediakan konfigurasi fragmen berbeda,
    740 berdasarkan konfigurasi layar.</p>
    741 
    742 <p class="note"><strong>Catatan:</strong> Kode sumber lengkap untuk aktivitas ini tersedia di
    743 <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html">{@code
    744 FragmentLayout.java}</a>.</p>
    745 
    746 <p>Aktivitas utama akan menerapkan layout seperti biasa, selama {@link
    747 android.app.Activity#onCreate onCreate()}:</p>
    748 
    749 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java main}
    750 
    751 <p>Layout yang diterapkan adalah {@code fragment_layout.xml}:</p>
    752 
    753 {@sample development/samples/ApiDemos/res/layout-land/fragment_layout.xml layout}
    754 
    755 <p>Dengan layout ini, sistem akan membuat instance {@code TitlesFragment} (yang mencantumkan
    756 judul) segera setelah aktivitas memuat layout, sementara {@link android.widget.FrameLayout}
    757  (lokasi penempatan fragmen untuk menampilkan rangkuman pemutaran) menempati ruang di sisi kanan
    758 layar, namun pada awalnya masih kosong. Seperti yang akan Anda lihat di bawah ini, sampai pengguna memilih item
    759 dari daftar maka fragmen baru akan ditempatkan ke dalam {@link android.widget.FrameLayout}.</p>
    760 
    761 <p>Akan tetapi, tidak semua konfigurasi layar cukup lebar untuk menampilkan
    762 daftar putar dan rangkuman secara berdampingan. Sehingga, layout di atas hanya digunakan untuk konfigurasi
    763 layar mendatar, dengan menyimpannya di {@code res/layout-land/fragment_layout.xml}.</p>
    764 
    765 <p>Sehingga, bila layar berada dalam orientasi tegak, sistem akan menerapkan layout berikut, yang
    766 tersimpan di {@code res/layout/fragment_layout.xml}:</p>
    767 
    768 {@sample development/samples/ApiDemos/res/layout/fragment_layout.xml layout}
    769 
    770 <p>Layout ini hanya menyertakan {@code TitlesFragment}. Ini artinya saat perangkat berada dalam
    771 orientasi tegak, hanya judul daftar putar yang terlihat. Jadi, saat pengguna mengklik item
    772 daftar dalam konfigurasi ini, aplikasi akan memulai aktivitas baru untuk menampilkan rangkuman,
    773 sebagai ganti pemuatan fragmen kedua.</p>
    774 
    775 <p>Berikutnya, Anda bisa melihat bagaimana hal ini dilakukan dalam kelas fragmen. Pertama adalah {@code
    776 TitlesFragment}, yang menampilkan judul daftar putar Shakespeare. Fragmen ini membuat ekstensi {@link
    777 android.app.ListFragment} dan mengandalkannya itu untuk menangani sebagian besar pekerjaan tampilan daftar.</p>
    778 
    779 <p>Saat Anda memeriksa kode ini, perhatikan bahwa ada dua kemungkinan perilaku saat pengguna mengklik
    780 item daftar: bergantung pada layout mana yang aktif, bisa membuat dan menampilkan fragmen
    781 baru untuk menampilkan detail dalam aktivitas yang sama (menambahkan fragmen ke {@link
    782 android.widget.FrameLayout}), atau memulai aktivitas baru (tempat fragmen ditampilkan).</p>
    783 
    784 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java titles}
    785 
    786 <p>Fragmen kedua, {@code DetailsFragment} menampilkan rangkuman pemutaran untuk item yang dipilih dari
    787 daftar dari {@code TitlesFragment}:</p>
    788 
    789 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java details}
    790 
    791 <p>Ingatlah dari kelas {@code TitlesFragment}, bahwa, jika pengguna mengklik item daftar dan
    792 layout saat ini <em>tidak</em> menyertakan tampilan {@code R.id.details} (yaitu tempat
    793 {@code DetailsFragment} berada), maka aplikasi memulai aktivitas {@code DetailsActivity}
    794 untuk menampilkan konten item.</p>
    795 
    796 <p>Berikut ini adalah {@code DetailsActivity}, yang hanya menanamkan {@code DetailsFragment} untuk menampilkan rangkuman pemutaran
    797 yang dipilih saat layar dalam orientasi tegak:</p>
    798 
    799 {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java
    800 details_activity}
    801 
    802 <p>Perhatikan bahwa aktivitas ini selesai sendiri jika konfigurasi mendatar, sehingga aktivitas utama
    803 bisa mengambil alih dan menampilkan {@code DetailsFragment} bersama {@code TitlesFragment}.
    804 Ini bisa terjadi jika pengguna memulai {@code DetailsActivity} saat dalam orientasi tegak, namun kemudian
    805 memutarnya menjadi mendatar (yang akan memulai lagi aktivitas saat ini).</p>
    806 
    807 
    808 <p>Untuk contoh lainnya mengenai penggunaan fragmen (dan file sumber lengkap untuk contoh ini),
    809 lihat aplikasi contoh Demo API yang tersedia di <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment">
    810 ApiDemos</a> (bisa diunduh dari <a href="{@docRoot}resources/samples/get.html">Komponen contoh SDK</a>).</p>
    811 
    812 
    813