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 —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 <fragment>}, 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—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—untuk melanjutkan contoh aplikasi berita— 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 @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}—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 <?xml version="1.0" encoding="utf-8"?> 274 <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"> 278 <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" /> 283 <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" /> 288 </LinearLayout> 289 </pre> 290 <p>Atribut {@code android:name} dalam {@code <fragment>} 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 <fragment>}.</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—Anda juga bisa 358 menyediakan tag string untuk fragmen yang memiliki UI—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><sdk_root>/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—satu untuk menampilkan daftar 524 artikel (fragmen A) dan satu lagi untuk menampilkan artikel (fragmen B)—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 @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 @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