| page.title=Fragmen |
| parent.title=Aktivitas |
| parent.link=activities.html |
| @jd:body |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| <h2>Dalam dokumen ini</h2> |
| <ol> |
| <li><a href="#Design">Filosofi Desain</a></li> |
| <li><a href="#Creating">Membuat Fragmen</a> |
| <ol> |
| <li><a href="#UI">Menambahkan antarmuka pengguna</a></li> |
| <li><a href="#Adding">Menambahkan fragmen ke aktivitas</a></li> |
| </ol> |
| </li> |
| <li><a href="#Managing">Mengelola Fragmen</a></li> |
| <li><a href="#Transactions">Melakukan Transaksi Fragmen</a></li> |
| <li><a href="#CommunicatingWithActivity">Berkomunikasi dengan Aktivitas</a> |
| <ol> |
| <li><a href="#EventCallbacks">Membuat callback kejadian pada aktivitas</a></li> |
| <li><a href="#ActionBar">Menambahkan item ke Action-Bar</a></li> |
| </ol> |
| </li> |
| <li><a href="#Lifecycle">Menangani Daur Hidup Fragmen</a> |
| <ol> |
| <li><a href="#CoordinatingWithActivity">Mengoordinasi dengan daur hidup aktivitas</a></li> |
| </ol> |
| </li> |
| <li><a href="#Example">Contoh</a></li> |
| </ol> |
| |
| <h2>Kelas-kelas utama</h2> |
| <ol> |
| <li>{@link android.app.Fragment}</li> |
| <li>{@link android.app.FragmentManager}</li> |
| <li>{@link android.app.FragmentTransaction}</li> |
| </ol> |
| |
| <h2>Lihat juga</h2> |
| <ol> |
| <li><a href="{@docRoot}training/basics/fragments/index.html">Membangun UI Dinamis dengan Fragmen</a></li> |
| <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">Mendukung Tablet |
| dan Handset</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <p>{@link android.app.Fragment} mewakili perilaku atau bagian dari antarmuka pengguna dalam |
| {@link android.app.Activity}. Anda bisa mengombinasikan beberapa fragmen dalam satu aktivitas untuk membangun UI |
| multipanel dan menggunakan kembali sebuah fragmen dalam beberapa aktivitas. Anda bisa menganggap fragmen sebagai bagian |
| modular dari aktivitas, yang memiliki daur hidup sendiri, menerima kejadian input sendiri, dan |
| yang bisa Anda tambahkan atau hapus saat aktivitas berjalan (semacam "sub aktivitas" yang |
| bisa digunakan kembali dalam aktivitas berbeda).</p> |
| |
| <p>Fragmen harus selalu tertanam dalam aktivitas dan daur hidup fragmen secara langsung |
| dipengaruhi oleh daur hidup aktivitas host-nya. Misalnya, saat aktivitas dihentikan sementara, |
| semua fragmen di dalamnya juga dihentikan sementara, dan bila aktivitas dimusnahkan, semua fragmen juga demikian. Akan tetapi, saat |
| aktivitas berjalan (dalam <a href="{@docRoot}guide/components/activities.html#Lifecycle">status daur hidup</a> <em>dilanjutkan</em>, Anda bisa |
| memanipulasi setiap fragmen secara terpisah, seperti menambah atau menghapusnya. Saat melakukan transaksi |
| fragmen, Anda juga bisa menambahkannya ke back-stack yang dikelola oleh aktivitas |
| —setiap entri back-stack merupakan record transaksi fragmen yang |
| terjadi. Dengan back-stack pengguna dapat membalikkan transaksi fragmen (mengarah mundur), |
| dengan menekan tombol <em>Back</em>.</p> |
| |
| <p>Bila Anda menambahkan fragmen sebagai bagian dari layout aktivitas, fragmen itu berada dalam {@link |
| android.view.ViewGroup} di hierarki tampilan aktivitas tersebut dan fragmen mendefinisikan |
| layout |
| tampilannya sendiri. Anda bisa menyisipkan fragmen ke dalam layout aktivitas dengan mendeklarasikan fragmen dalam file layout aktivitas |
| , sebagai elemen {@code <fragment>}, atau dari kode aplikasi dengan menambahkannya ke |
| {@link android.view.ViewGroup} yang ada. Akan tetapi, fragmen tidak harus menjadi bagian dari |
| layout aktivitas; Anda juga bisa menggunakan fragmen tanpa UI-nya sendiri sebagai pekerja tak terlihat untuk |
| aktivitas tersebut.</p> |
| |
| <p>Dokumen ini menjelaskan cara membangun aplikasi menggunakan fragmen, termasuk |
| cara fragmen mempertahankan statusnya bila ditambahkan ke back-stack aktivitas, berbagi |
| kejadian dengan aktivitas, dan fragmen lain dalam aktivitas, berkontribusi pada action-bar |
| aktivitas, dan lainnya.</p> |
| |
| |
| <h2 id="Design">Filosofi Desain</h2> |
| |
| <p>Android memperkenalkan fragmen di Android 3.0 (API level 11), terutama untuk mendukung desain UI yang lebih |
| dinamis dan fleksibel pada layar besar, seperti tablet. Karena |
| layar tablet jauh lebih besar daripada layar handset, maka lebih banyak ruang untuk mengombinasikan dan |
| bertukar komponen UI. Fragmen memungkinkan desain seperti itu tanpa perlu mengelola perubahan |
| kompleks pada hierarki tampilan. Dengan membagi layout aktivitas menjadi beberapa fragmen, Anda bisa |
| mengubah penampilan aktivitas saat runtime dan mempertahankan perubahan itu di back-stack |
| yang dikelola oleh aktivitas.</p> |
| |
| <p>Misalnya, aplikasi berita bisa menggunakan satu fragmen untuk menampilkan daftar artikel di |
| sebelah kiri dan fragmen lainnya untuk menampilkan artikel di sebelah kanan—kedua fragmen ini muncul di satu |
| aktivitas, berdampingan, dan masing-masing fragmen memiliki serangkaian metode callback daur hidup dan menangani kejadian input |
| penggunanya sendiri. Sehingga, sebagai ganti menggunakan satu aktivitas untuk memilih |
| artikel dan aktivitas lainnya untuk membaca artikel, pengguna bisa memilih artikel dan membaca semuanya dalam |
| aktivitas yang sama, sebagaimana diilustrasikan dalam layout tablet pada gambar 1.</p> |
| |
| <p>Anda harus mendesain masing-masing fragmen sebagai komponen aktivitas modular dan bisa digunakan kembali. Yakni, karena |
| setiap fragmen mendefinisikan layoutnya dan perilakunya dengan callback daur hidupnya sendiri, Anda bisa memasukkan |
| satu fragmen dalam banyak aktivitas, sehingga Anda harus mendesainnya untuk digunakan kembali dan mencegah |
| memanipulasi satu fragmen dari fragmen lain secara langsung. Ini terutama penting karena dengan |
| fragmen modular Anda bisa mengubah kombinasi fragmen untuk ukuran layar berbeda. Saat mendesain aplikasi |
| untuk mendukung tablet maupun handset, Anda bisa menggunakan kembali fragmen dalam |
| konfigurasi layout berbeda untuk mengoptimalkan pengalaman pengguna berdasarkan ruang layar yang tersedia. Misalnya |
| , pada handset, fragmen mungkin perlu dipisahkan untuk menyediakan UI panel tunggal |
| bila lebih dari satu yang tidak cocok dalam aktivitas yang sama.</p> |
| |
| <img src="{@docRoot}images/fundamentals/fragments.png" alt="" /> |
| <p class="img-caption"><strong>Gambar 1.</strong> Contoh cara dua modul UI yang didefinisikan oleh |
| fragmen bisa digabungkan ke dalam satu aktivitas untuk desain tablet, namun dipisahkan untuk |
| desain handset.</p> |
| |
| <p>Misalnya—untuk melanjutkan contoh aplikasi berita— aplikasi bisa menanamkan |
| dua fragmen dalam <em>Aktivitas A</em>, saat berjalan pada perangkat berukuran tablet. Akan tetapi, pada |
| layar berukuran handset, ruang untuk kedua fragmen tidak cukup, sehingga <em>Aktivitas A</em> hanya |
| menyertakan fragmen untuk daftar artikel, dan saat pengguna memilih artikel, |
| <em>Aktivitas B</em> akan dimulai, termasuk fragmen kedua untuk membaca artikel. Sehingga, aplikasi mendukung |
| tablet dan handset dengan menggunakan kembali fragmen dalam kombinasi berbeda, seperti diilustrasikan dalam |
| gambar 1.</p> |
| |
| <p>Untuk informasi selengkapnya tentang mendesain aplikasi menggunakan kombinasi fragmen berbeda |
| untuk konfigurasi layar berbeda, lihat panduan untuk <a href="{@docRoot}guide/practices/tablets-and-handsets.html">Mendukung Tablet dan Handset</a>.</p> |
| |
| |
| |
| <h2 id="Creating">Membuat Fragmen</h2> |
| |
| <div class="figure" style="width:327px"> |
| <img src="{@docRoot}images/fragment_lifecycle.png" alt="" /> |
| <p class="img-caption"><strong>Gambar 2.</strong> Daur hidup fragmen (saat |
| aktivitasnya berjalan).</p> |
| </div> |
| |
| <p>Untuk membuat fragmen, Anda harus membuat subkelas {@link android.app.Fragment} (atau |
| subkelasnya yang ada). Kelas {@link android.app.Fragment} memiliki kode yang mirip seperti |
| {@link android.app.Activity}. Kelas ini memiliki metode callback yang serupa dengan aktivitas, seperti |
| {@link android.app.Fragment#onCreate onCreate()}, {@link android.app.Fragment#onStart onStart()}, |
| {@link android.app.Fragment#onPause onPause()}, dan {@link android.app.Fragment#onStop onStop()}. Sebenarnya |
| , jika Anda mengkonversi aplikasi Android saat ini untuk menggunakan fragmen, Anda mungkin cukup memindahkan |
| kode dari metode callback aktivitas ke masing-masing metode callback |
| fragmen.</p> |
| |
| <p>Biasanya, Anda harus mengimplementasikan setidaknya metode daur hidup berikut ini:</p> |
| |
| <dl> |
| <dt>{@link android.app.Fragment#onCreate onCreate()}</dt> |
| <dd>Sistem akan memanggilnya saat membuat fragmen. Dalam implementasi, Anda harus |
| menginisialisasi komponen penting dari fragmen yang ingin dipertahankan saat fragmen |
| dihentikan sementara atau dihentikan, kemudian dilanjutkan.</dd> |
| <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt> |
| <dd>Sistem akan memanggilnya saat fragmen menggambar antarmuka penggunanya |
| untuk yang pertama kali. Untuk menggambar UI fragmen, Anda harus mengembalikan {@link android.view.View} dari metode |
| ini yang menjadi akar layout fragmen. Hasil yang dikembalikan bisa berupa null jika |
| fragmen tidak menyediakan UI.</dd> |
| <dt>{@link android.app.Activity#onPause onPause()}</dt> |
| <dd>Sistem akan memanggil metode ini sebagai indikasi pertama bahwa pengguna sedang meninggalkan |
| fragmen Anda (walau itu tidak selalu berarti fragmen sedang dimusnahkan). Inilah biasanya tempat Anda |
| harus mengikat setiap perubahan yang harus dipertahankan selepas sesi pengguna saat ini (karena |
| pengguna mungkin tidak kembali).</dd> |
| </dl> |
| |
| <p>Kebanyakan aplikasi harus mengimplementasikan setidaknya tiga metode ini untuk setiap fragmen, namun ada |
| beberapa metode callback lain yang juga harus Anda gunakan untuk menangani berbagai tahap |
| daur hidup fragmen. Semua metode callback daur hidup akan dibahas secara lebih detail, di bagian |
| tentang <a href="#Lifecycle">Menangani Daur Hidup Fragmen</a>.</p> |
| |
| |
| <p>Ada juga beberapa subkelas yang mungkin ingin diperpanjang, sebagai ganti kelas basis {@link |
| android.app.Fragment}:</p> |
| |
| <dl> |
| <dt>{@link android.app.DialogFragment}</dt> |
| <dd>Menampilkan dialog mengambang. Penggunaan kelas ini untuk membuat dialog merupakan alternatif yang baik dari |
| penggunaan metode helper dialog di kelas {@link android.app.Activity}, karena Anda bisa |
| menyatukan dialog fragmen ke dalam back-stack fragmen yang dikelola oleh aktivitas, |
| sehingga pengguna bisa kembali ke fragmen yang ditinggalkan.</dd> |
| |
| <dt>{@link android.app.ListFragment}</dt> |
| <dd>Menampilkan daftar item yang dikelola oleh adaptor (seperti {@link |
| android.widget.SimpleCursorAdapter}), serupa dengan {@link android.app.ListActivity}. Menampilkan |
| beberapa metode pengelolaan daftar tampilan seperti callback {@link |
| android.app.ListFragment#onListItemClick(ListView,View,int,long) onListItemClick()} untuk |
| menangani kejadian klik.</dd> |
| |
| <dt>{@link android.preference.PreferenceFragment}</dt> |
| <dd>Menampilkan hierarki objek {@link android.preference.Preference} sebagai daftar, serupa dengan |
| {@link android.preference.PreferenceActivity}. Hal ini berguna saat membuat aktivitas |
| "pengaturan" untuk aplikasi Anda.</dd> |
| </dl> |
| |
| |
| <h3 id="UI">Menambahkan antarmuka pengguna</h3> |
| |
| <p>Fragmen biasanya digunakan sebagai bagian dari antarmuka pengguna aktivitas dan menyumbangkan |
| layoutnya sendiri ke aktivitas.</p> |
| |
| <p>Untuk menyediakan layout fragmen, Anda harus mengimplementasikan metode callback {@link |
| android.app.Fragment#onCreateView onCreateView()}, yang dipanggil sistem Android |
| bila tiba saatnya fragmen menggambar layoutnya. Implementasi Anda atas metode ini harus mengembalikan |
| {@link android.view.View} yang menjadi akar layout fragmen.</p> |
| |
| <p class="note"><strong>Catatan:</strong> Jika fragmen adalah subkelas {@link |
| android.app.ListFragment}, implementasi default akan mengembalikan {@link android.widget.ListView} dari |
| {@link android.app.Fragment#onCreateView onCreateView()}, sehingga Anda tidak perlu mengimplementasikannya.</p> |
| |
| <p>Untuk mengembalikan layout dari {@link |
| 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 |
| membantu melakukannya, {@link android.app.Fragment#onCreateView onCreateView()} menyediakan objek |
| {@link android.view.LayoutInflater}.</p> |
| |
| <p>Misalnya, ini adalah subkelas {@link android.app.Fragment} yang memuat layout dari file |
| {@code example_fragment.xml}:</p> |
| |
| <pre> |
| public static class ExampleFragment extends Fragment { |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| // Inflate the layout for this fragment |
| return inflater.inflate(R.layout.example_fragment, container, false); |
| } |
| } |
| </pre> |
| |
| <div class="sidebox-wrapper"> |
| <div class="sidebox"> |
| <h3>Membuat layout</h3> |
| <p>Dalam contoh di atas, {@code R.layout.example_fragment} merupakan acuan ke sumber daya layout |
| bernama {@code example_fragment.xml} yang tersimpan dalam sumber daya aplikasi. Untuk informasi tentang cara |
| membuat layout di XML, lihat dokumentasi |
| <a href="{@docRoot}guide/topics/ui/index.html">Antarmuka Pengguna</a>.</p> |
| </div> |
| </div> |
| |
| <p>Parameter {@code container} yang diteruskan ke {@link android.app.Fragment#onCreateView |
| onCreateView()} adalah induk {@link android.view.ViewGroup} (dari layout aktivitas) tempat |
| layout fragmen |
| akan disisipkan. Parameter {@code savedInstanceState} adalah {@link android.os.Bundle} yang |
| menyediakan data tentang instance fragmen sebelumnya, jika fragmen dilanjutkan |
| (status pemulihan dibahas selengkapnya di bagian tentang <a href="#Lifecycle">Menangani |
| Daur Hidup Fragmen</a>).</p> |
| |
| <p>Metode {@link android.view.LayoutInflater#inflate(int,ViewGroup,boolean) inflate()} membutuhkan |
| tiga argumen:</p> |
| <ul> |
| <li>ID sumber daya layout yang ingin dimekarkan.</li> |
| <li>{@link android.view.ViewGroup} akan menjadi induk dari layout yang dimekarkan. {@code |
| container} perlu diteruskan agar sistem menerapkan parameter layout ke tampilan akar layout |
| yang dimekarkan, yang ditetapkan dalam tampilan induk yang akan dituju.</li> |
| <li>Boolean yang menunjukkan apakah layout akan dimekarkan harus ditempelkan pada {@link |
| android.view.ViewGroup} (parameter kedua) selama pemekaran. (Dalam hal ini, ini |
| salah karena sistem sudah memasukkan layout yang dimekarkan ke dalam {@code |
| container}—meneruskan benar akan membuat tampilan grup yang berlebihan dalam layout akhir.)</li> |
| </ul> |
| |
| <p>Anda kini telah melihat cara membuat fragmen yang menyediakan layout. Berikutnya, Anda perlu menambahkan |
| fragmen ke aktivitas.</p> |
| |
| |
| |
| <h3 id="Adding">Menambahkan fragmen ke aktivitas</h3> |
| |
| <p>Biasanya, fragmen berkontribusi pada sebagian UI ke aktivitas host, yang ditanamkan sebagai |
| bagian dari hierarki tampilan keseluruhan aktivitas. Ada dua cara untuk menambahkan fragmen ke layout |
| aktivitas:</p> |
| |
| <ul> |
| <li><b>Deklarasikan fragmen dalam file layout aktivitas.</b> |
| <p>Dalam hal ini, Anda bisa |
| menetapkan properti layout fragmen seakan-akan sebuah tampilan. Misalnya, berikut ini adalah file |
| layout untuk aktivitas dengan dua fragmen:</p> |
| <pre> |
| <?xml version="1.0" encoding="utf-8"?> |
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
| android:orientation="horizontal" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent"> |
| <fragment android:name="com.example.news.ArticleListFragment" |
| android:id="@+id/list" |
| android:layout_weight="1" |
| android:layout_width="0dp" |
| android:layout_height="match_parent" /> |
| <fragment android:name="com.example.news.ArticleReaderFragment" |
| android:id="@+id/viewer" |
| android:layout_weight="2" |
| android:layout_width="0dp" |
| android:layout_height="match_parent" /> |
| </LinearLayout> |
| </pre> |
| <p>Atribut {@code android:name} dalam {@code <fragment>} menetapkan kelas {@link |
| android.app.Fragment} untuk dibuat instance-nya dalam layout.</p> |
| |
| <p>Saat sistem membuat layout aktivitas, sistem membuat instance setiap fragmen sebagaimana yang ditetapkan dalam layout |
| dan memanggil metode {@link android.app.Fragment#onCreateView onCreateView()} masing-masing, |
| untuk mengambil setiap fragmen. Sistem akan menyisipkan {@link android.view.View} yang dikembalikan langsung oleh fragmen, |
| menggantikan elemen {@code <fragment>}.</p> |
| |
| <div class="note"> |
| <p><strong>Catatan:</strong> Setiap fragmen memerlukan identifier |
| unik yang bisa digunakan sistem untuk memulihkan fragmen jika aktivitas dimulai kembali (dan identifier yang bisa digunakan menangkap |
| fragmen untuk melakukan transaksi, seperti menghapusnya). Ada tiga cara untuk memberikan |
| ID bagi fragmen:</p> |
| <ul> |
| <li>Memberikan atribut {@code android:id} bersama ID unik.</li> |
| <li>Memberikan atribut {@code android:tag} bersama string unik.</li> |
| <li>Jika Anda tidak memberikan dua hal tersebut, sistem akan menggunakan ID |
| tampilan kontainer.</li> |
| </ul> |
| </div> |
| </li> |
| |
| <li><b>Atau, secara programatis tambahkan fragmen ke {@link android.view.ViewGroup} yang ada.</b> |
| <p>Kapan saja saat aktivitas berjalan, Anda bisa menambahkan fragmen ke layout aktivitas. Anda |
| cukup menetapkan {@link |
| android.view.ViewGroup} di tempat memasukkan fragmen.</p> |
| <p>Untuk membuat transaksi fragmen dalam aktivitas (seperti menambah, menghapus, atau mengganti |
| fragmen), Anda harus menggunakan API dari {@link android.app.FragmentTransaction}. Anda bisa mengambil instance |
| {@link android.app.FragmentTransaction} dari {@link android.app.Activity} seperti ini:</p> |
| |
| <pre> |
| FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()} |
| FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()}; |
| </pre> |
| |
| <p>Selanjutnya Anda bisa menambahkan fragmen menggunakan metode {@link |
| android.app.FragmentTransaction#add(int,Fragment) add()}, dengan menetapkan fragmen yang akan ditambahkan dan |
| tampilan tempat menyisipkannya. Misalnya:</p> |
| |
| <pre> |
| ExampleFragment fragment = new ExampleFragment(); |
| fragmentTransaction.add(R.id.fragment_container, fragment); |
| fragmentTransaction.commit(); |
| </pre> |
| |
| <p>Argumen pertama yang diteruskan ke {@link android.app.FragmentTransaction#add(int,Fragment) add()} |
| adalah {@link android.view.ViewGroup} tempat fragmen harus dimasukkan, yang ditetapkan oleh |
| ID sumber daya, dan parameter kedua merupakan fragmen yang akan ditambahkan.</p> |
| <p>Setelah membuat perubahan dengan |
| {@link android.app.FragmentTransaction}, Anda harus |
| memanggil {@link android.app.FragmentTransaction#commit} untuk menerapkan perubahan.</p> |
| </li> |
| </ul> |
| |
| |
| <h4 id="AddingWithoutUI">Menambahkan fragmen tanpa UI</h4> |
| |
| <p>Contoh di atas menampilkan cara menambahkan fragmen ke aktivitas untuk menyediakan UI. Akan tetapi, |
| Anda juga bisa menggunakan fragmen untuk menyediakan perilaku latar belakang bagi aktivitas tanpa menampilkan UI |
| tambahan.</p> |
| |
| <p>Untuk menambahkan fragmen tanpa UI, tambahkan fragmen dari aktivitas menggunakan {@link |
| android.app.FragmentTransaction#add(Fragment,String)} (dengan menyediakan string unik "tag" untuk fragmen |
| , bukan ID tampilan). Ini akan menambahkan fragmen, namun, karena tidak dikaitkan dengan tampilan |
| dalam layout aktivitas, ini tidak akan menerima panggilan ke {@link |
| android.app.Fragment#onCreateView onCreateView()}. Jadi Anda tidak perlu mengimplementasikan metode itu.</p> |
| |
| <p>Menyediakan tag string untuk fragmen tidak hanya untuk fragmen non-UI—Anda juga bisa |
| menyediakan tag string untuk fragmen yang memiliki UI—namun jika fragmen tidak memiliki UI |
| , maka tag string adalah satu-satunya cara untuk mengidentifikasinya. Jika Anda ingin mendapatkan fragmen dari |
| aktivitas nantinya, Anda perlu menggunakan {@link android.app.FragmentManager#findFragmentByTag |
| findFragmentByTag()}.</p> |
| |
| <p>Untuk contoh aktivitas yang menggunakan fragmen sebagai pekerja latar belakang, tanpa UI, lihat sampel {@code |
| FragmentRetainInstance.java}, yang disertakan dalam sampel SDK (tersedia melalui |
| Android SDK Manager) dan terletak di sistem Anda sebagai |
| <code><sdk_root>/APIDemos/app/src/main/java/com/example/android/apis/app/FragmentRetainInstance.java</code>.</p> |
| |
| |
| |
| <h2 id="Managing">Mengelola Fragmen</h2> |
| |
| <p>Untuk mengelola fragmen dalam aktivitas, Anda perlu menggunakan {@link android.app.FragmentManager}. Untuk |
| mendapatkannya, panggil {@link android.app.Activity#getFragmentManager()} dari aktivitas Anda.</p> |
| |
| <p>Beberapa hal yang dapat Anda lakukan dengan {@link android.app.FragmentManager} antara lain:</p> |
| |
| <ul> |
| <li>Dapatkan fragmen yang ada di aktivitas dengan {@link |
| android.app.FragmentManager#findFragmentById findFragmentById()} (untuk fragmen yang menyediakan UI dalam |
| layout aktivitas) atau {@link android.app.FragmentManager#findFragmentByTag |
| findFragmentByTag()} (untuk fragmen yang menyediakan atau tidak menyediakan UI).</li> |
| <li>Tarik fragmen dari back-stack, dengan {@link |
| android.app.FragmentManager#popBackStack()} (mensimulasikan perintah <em>Back</em> oleh pengguna).</li> |
| <li>Daftarkan listener untuk perubahan pada back-stack, dengan {@link |
| android.app.FragmentManager#addOnBackStackChangedListener addOnBackStackChangedListener()}.</li> |
| </ul> |
| |
| <p>Untuk informasi selengkapnya tentang metode ini dan hal lainnya, lihat dokumentasi kelas {@link |
| android.app.FragmentManager}.</p> |
| |
| <p>Seperti yang ditunjukkan di bagian sebelumnya, Anda juga bisa menggunakan {@link android.app.FragmentManager} |
| untuk membuka {@link android.app.FragmentTransaction}, sehingga Anda bisa melakukan transaksi, seperti |
| menambah dan menghapus fragmen.</p> |
| |
| |
| <h2 id="Transactions">Melakukan Transaksi Fragmen</h2> |
| |
| <p>Fitur menarik terkait penggunaan fragmen di aktivitas adalah kemampuan menambah, menghapus, mengganti, |
| dan melakukan tindakan lain dengannya, sebagai respons atas interaksi pengguna. Setiap set perubahan |
| yang Anda lakukan untuk aktivitas disebut transaksi dan Anda bisa melakukan transaksi menggunakan API di {@link |
| android.app.FragmentTransaction}. Anda juga bisa menyimpan setiap transaksi ke back-stack yang dikelola |
| aktivitas, sehingga pengguna bisa mengarah mundur melalui perubahan fragmen (mirip mengarah |
| mundur melalui aktivitas).</p> |
| |
| <p>Anda bisa mengambil instance {@link android.app.FragmentTransaction} dari {@link |
| android.app.FragmentManager} seperti ini:</p> |
| |
| <pre> |
| FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()}; |
| FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()}; |
| </pre> |
| |
| <p>Setiap transaksi merupakan serangkaian perubahan yang ingin dilakukan pada waktu yang sama. Anda bisa |
| mengatur semua perubahan yang ingin dilakukan untuk transaksi mana saja menggunakan metode seperti {@link |
| android.app.FragmentTransaction#add add()}, {@link android.app.FragmentTransaction#remove remove()}, |
| dan {@link android.app.FragmentTransaction#replace replace()}. Kemudian, untuk menerapkan transaksi |
| pada aktivitas, Anda harus memanggil {@link android.app.FragmentTransaction#commit()}.</p> |
| </dl> |
| |
| <p>Akan tetapi, sebelum memanggil {@link |
| android.app.FragmentTransaction#commit()}, Anda mungkin perlu memanggil {@link |
| android.app.FragmentTransaction#addToBackStack addToBackStack()}, untuk menambahkan transaksi |
| ke back-stack dari transaksi fragmen. Back-stack ini dikelola oleh aktivitas dan memungkinkan |
| pengguna kembali ke status fragmen sebelumnya, dengan menekan tombol <em>Back</em>.</p> |
| |
| <p>Misalnya, berikut ini cara mengganti satu fragmen dengan yang fragmen yang lain, dan mempertahankan |
| status sebelumnya di back-stack:</p> |
| |
| <pre> |
| // Create new fragment and transaction |
| Fragment newFragment = new ExampleFragment(); |
| FragmentTransaction transaction = getFragmentManager().beginTransaction(); |
| |
| // Replace whatever is in the fragment_container view with this fragment, |
| // and add the transaction to the back stack |
| transaction.replace(R.id.fragment_container, newFragment); |
| transaction.addToBackStack(null); |
| |
| // Commit the transaction |
| transaction.commit(); |
| </pre> |
| |
| <p>Dalam contoh ini, {@code newFragment} menggantikan fragmen apa saja (jika ada) yang saat ini berada dalam |
| kontainer layout yang diidentifikasi oleh ID {@code R.id.fragment_container}. Dengan memanggil @link |
| android.app.FragmentTransaction#addToBackStack addToBackStack()}, transaksi yang diganti |
| disimpan ke back-stack sehingga pengguna bisa membalikkan transaksi dan mengembalikan fragmen |
| sebelumnya dengan menekan tombol <em>Back</em>.</p> |
| |
| <p>Jika Anda menambahkan beberapa perubahan pada transaksi (seperti {@link |
| android.app.FragmentTransaction#add add()} atau {@link android.app.FragmentTransaction#remove |
| remove()}) dan panggil {@link |
| android.app.FragmentTransaction#addToBackStack addToBackStack()}, maka semua perubahan akan diterapkan |
| sebelum Anda memanggil {@link android.app.FragmentTransaction#commit commit()} akan ditambahkan ke |
| back-stack sebagai satu transaksi dan tombol <em>Back</em> akan membalikannya semua.</p> |
| |
| <p>Urutan menambahkan perubahan pada {@link android.app.FragmentTransaction} tidak berpengaruh, |
| kecuali:</p> |
| <ul> |
| <li>Anda harus memanggil {@link android.app.FragmentTransaction#commit()} paling akhir</li> |
| <li>Jika Anda menambahkan beberapa fragmen ke kontainer yang sama, maka |
| urutan penambahannya akan menentukan urutan munculnya dalam hierarki tampilan</li> |
| </ul> |
| |
| <p>Jika Anda tidak memanggil {@link android.app.FragmentTransaction#addToBackStack(String) |
| addToBackStack()} saat melakukan transaksi yang menghapus fragmen, maka fragmen itu |
| akan dimusnahkan bila transaksi diikat dan pengguna tidak bisa mengarah kembali ke sana. Sedangkan, jika |
| Anda memanggil {@link android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} saat |
| menghapus fragmen, maka fragmen itu akan <em>dihentikan</em> dan akan dilanjutkan jika pengguna mengarah |
| kembali.</p> |
| |
| <p class="note"><strong>Tip:</strong> Untuk setiap transaksi fragmen, Anda bisa menerapkan animasi |
| transisi, dengan memanggil {@link android.app.FragmentTransaction#setTransition setTransition()} sebelum |
| mengikatnya.</p> |
| |
| <p>Memanggil {@link android.app.FragmentTransaction#commit()} tidak akan langsung menjalankan |
| transaksi. Namun sebuah jadwal akan dibuat untuk dijalankan pada thread UI aktivitas (thread "utama") |
| begitu thread bisa melakukannya. Akan tetapi, jika perlu Anda bisa memanggil {@link |
| android.app.FragmentManager#executePendingTransactions()} dari thread UI untuk segera |
| mengeksekusi transaksi yang diserahkan oleh {@link android.app.FragmentTransaction#commit()}. Hal itu |
| biasanya tidak perlu kecuali jika transaksi merupakan dependensi bagi pekerjaan dalam thread lain.</p> |
| |
| <p class="caution"><strong>Perhatian:</strong> Anda bisa mengikat transaksi menggunakan {@link |
| android.app.FragmentTransaction#commit commit()} hanya sebelum aktivitas <a href="{@docRoot}guide/components/activities.html#SavingActivityState">menyimpan |
| statusnya</a> (saat pengguna meninggalkan aktivitas). Jika Anda mencoba mengikatnya setelah itu, |
| eksepsi akan dilontarkan. Ini karena status setelah pengikatan bisa hilang jika aktivitas |
| perlu dipulihkan. Untuk situasi yang memperbolehkan Anda meniadakan pengikatan (commit), gunakan {@link |
| android.app.FragmentTransaction#commitAllowingStateLoss()}.</p> |
| |
| |
| |
| |
| <h2 id="CommunicatingWithActivity">Berkomunikasi dengan Aktivitas</h2> |
| |
| <p>Meskipun {@link android.app.Fragment} diimplementasikan sebagai objek yang tidak bergantung pada |
| {@link android.app.Activity} dan bisa digunakan dalam banyak aktivitas, instance tertentu |
| dari fragmen secara langsung terkait dengan aktivitas yang dimuatnya.</p> |
| |
| <p>Khususnya, fragmen bisa mengakses instance {@link android.app.Activity} dengan {@link |
| android.app.Fragment#getActivity()} dan dengan mudah melakukan tugas-tugas seperti mencari tampilan dalam |
| layout aktivitas:</p> |
| |
| <pre> |
| View listView = {@link android.app.Fragment#getActivity()}.{@link android.app.Activity#findViewById findViewById}(R.id.list); |
| </pre> |
| |
| <p>Demikian pula, aktivitas Anda bisa memanggil metode di fragmen dengan meminta acuan ke |
| {@link android.app.Fragment} dari {@link android.app.FragmentManager}, menggunakan {@link |
| android.app.FragmentManager#findFragmentById findFragmentById()} atau {@link |
| android.app.FragmentManager#findFragmentByTag findFragmentByTag()}. Misalnya:</p> |
| |
| <pre> |
| ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); |
| </pre> |
| |
| |
| <h3 id="EventCallbacks">Membuat callback kejadian pada aktivitas</h3> |
| |
| <p>Dalam beberapa kasus, Anda mungkin perlu fragmen untuk berbagi kejadian dengan aktivitas. Cara yang baik untuk melakukannya |
| adalah mendefinisikan antarmuka callback di dalam fragmen dan mengharuskan aktivitas host |
| mengimplementasikannya. Saat aktivitas menerima callback melalui antarmuka, aktivitas akan bisa berbagi informasi itu |
| dengan fragmen lain dalam layout jika perlu.</p> |
| |
| <p>Misalnya, jika sebuah aplikasi berita memiliki dua fragmen dalam aktivitas—satu untuk menampilkan daftar |
| artikel (fragmen A) dan satu lagi untuk menampilkan artikel (fragmen B)—maka fragmen A harus |
| memberi tahu aktivitas bila item daftar dipilih sehingga aktivitas bisa memberi tahu fragmen B untuk menampilkan artikel. Dalam |
| hal ini, antarmuka {@code OnArticleSelectedListener} dideklarasikan di dalam fragmen A:</p> |
| |
| <pre> |
| public static class FragmentA extends ListFragment { |
| ... |
| // Container Activity must implement this interface |
| public interface OnArticleSelectedListener { |
| public void onArticleSelected(Uri articleUri); |
| } |
| ... |
| } |
| </pre> |
| |
| <p>Selanjutnya aktivitas yang menjadi host fragmen akan mengimplementasikan antarmuka {@code OnArticleSelectedListener} |
| dan |
| mengesampingkan {@code onArticleSelected()} untuk memberi tahu fragmen B mengenai kejadian dari fragmen A. Untuk memastikan |
| bahwa aktivitas host mengimplementasikan antarmuka ini, metode callback fragmen A {@link |
| android.app.Fragment#onAttach onAttach()} (yang dipanggil sistem saat menambahkan |
| fragmen ke aktivitas) membuat instance {@code OnArticleSelectedListener} dengan |
| membuat {@link android.app.Activity} yang diteruskan ke {@link android.app.Fragment#onAttach |
| onAttach()}:</p> |
| |
| <pre> |
| public static class FragmentA extends ListFragment { |
| OnArticleSelectedListener mListener; |
| ... |
| @Override |
| public void onAttach(Activity activity) { |
| super.onAttach(activity); |
| try { |
| mListener = (OnArticleSelectedListener) activity; |
| } catch (ClassCastException e) { |
| throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); |
| } |
| } |
| ... |
| } |
| </pre> |
| |
| <p>Jika aktivitas belum mengimplementasikan antarmuka, maka fragmen akan melontarkan |
| {@link java.lang.ClassCastException}. |
| Jika berhasil, anggota {@code mListener} yang menyimpan acuan ke implementasi aktivitas |
| {@code OnArticleSelectedListener}, sehingga fragmen A bisa berbagi kejadian dengan aktivitas, dengan memanggil metode |
| yang didefinisikan oleh antarmuka {@code OnArticleSelectedListener}. Misalnya, jika fragmen A adalah |
| ekstensi dari {@link android.app.ListFragment}, maka setiap kali |
| pengguna mengklik item daftar, sistem akan memanggil {@link android.app.ListFragment#onListItemClick |
| onListItemClick()} di fragmen, yang selanjutnya memanggil {@code onArticleSelected()} untuk berbagi |
| kejadian dengan aktivitas:</p> |
| |
| <pre> |
| public static class FragmentA extends ListFragment { |
| OnArticleSelectedListener mListener; |
| ... |
| @Override |
| public void onListItemClick(ListView l, View v, int position, long id) { |
| // Append the clicked item's row ID with the content provider Uri |
| Uri noteUri = ContentUris.{@link android.content.ContentUris#withAppendedId withAppendedId}(ArticleColumns.CONTENT_URI, id); |
| // Send the event and Uri to the host activity |
| mListener.onArticleSelected(noteUri); |
| } |
| ... |
| } |
| </pre> |
| |
| <p>Parameter {@code id} yang diteruskan ke {@link |
| android.app.ListFragment#onListItemClick onListItemClick()} merupakan ID baris dari item yang diklik, |
| yang digunakan aktivitas (atau fragmen lain) untuk mengambil artikel dari {@link |
| android.content.ContentProvider} aplikasi.</p> |
| |
| <p><!--To see a complete implementation of this kind of callback interface, see the <a |
| href="{@docRoot}resources/samples/NotePad/index.html">NotePad sample</a>. -->Informasi selengkapnya tentang |
| menggunakan penyedia konten tersedia dalam dokumen <a href="{@docRoot}guide/topics/providers/content-providers.html">Penyedia Konten</a>.</p> |
| |
| |
| |
| <h3 id="ActionBar">Menambahkan item ke Action-Bar</h3> |
| |
| <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 |
| {@link android.app.Fragment#onCreateOptionsMenu(Menu,MenuInflater) onCreateOptionsMenu()}. Agar |
| metode ini bisa menerima panggilan, Anda harus memanggil {@link |
| android.app.Fragment#setHasOptionsMenu(boolean) setHasOptionsMenu()} selama {@link |
| android.app.Fragment#onCreate(Bundle) onCreate()}, untuk menunjukkan bahwa fragmen |
| ingin menambahkan item ke Menu Opsi (jika tidak, fragmen tidak akan menerima panggilan ke |
| {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()}).</p> |
| |
| <p>Setiap item yang selanjutnya Anda tambahkan ke Menu Opsi dari fragmen akan ditambahkan ke item menu |
| yang ada. Fragmen juga menerima callback ke {@link |
| android.app.Fragment#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} bila item menu |
| dipilih.</p> |
| |
| <p>Anda juga bisa mendaftarkan tampilan dalam layout fragmen untuk menyediakan menu konteks dengan memanggil {@link |
| android.app.Fragment#registerForContextMenu(View) registerForContextMenu()}. Bila pengguna |
| membuka menu konteks, fragmen akan menerima panggilan ke {@link |
| android.app.Fragment#onCreateContextMenu(ContextMenu,View,ContextMenu.ContextMenuInfo) |
| onCreateContextMenu()}. Bila pengguna memilih item, fragmen akan menerima panggilan ke @link |
| android.app.Fragment#onContextItemSelected(MenuItem) onContextItemSelected()}.</p> |
| |
| <p class="note"><strong>Catatan:</strong> Walaupun fragmen menerima callback pada item yang dipilih |
| untuk setiap item menu yang ditambahkannya, aktivitaslah yang pertama kali menerima masing-masing callback saat pengguna |
| memilih item menu. Jika implementasi aktivitas dari callback bila-item-dipilih, |
| tidak menangani item yang dipilih, maka kejadian akan diteruskan ke callback fragmen. Ini berlaku |
| untuk Menu Opsi dan menu konteks.</p> |
| |
| <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> |
| |
| |
| |
| |
| <h2 id="Lifecycle">Menangani Daur Hidup Fragmen</h2> |
| |
| <div class="figure" style="width:350px"> |
| <img src="{@docRoot}images/activity_fragment_lifecycle.png" alt="" /> |
| <p class="img-caption"><strong>Gambar 3.</strong> Efek daur hidup aktivitas pada daur hidup |
| fragmen.</p> |
| </div> |
| |
| <p>Mengelola daur hidup fragmen mirip sekali dengan mengelola daur hidup aktivitas. Seperti |
| aktivitas, fragmen bisa berada dalam tiga status:</p> |
| |
| <dl> |
| <dt><i>Dilanjutkan</i></dt> |
| <dd>Fragmen terlihat dalam aktivitas yang berjalan.</dd> |
| |
| <dt><i>Dihentikan sementara</i></dt> |
| <dd>Aktivitas lain berada di latar depan dan memiliki fokus, namun aktivitas tempat fragmen berada |
| masih terlihat (aktivitas latar depan sebagian terlihat atau tidak menutupi |
| seluruh layar).</dd> |
| |
| <dt><i>Dihentikan</i></dt> |
| <dd>Fragmen tidak terlihat. Aktivitas host telah dihentikan atau |
| fragmen telah dihapus dari aktivitas namun ditambahkan ke back-stack. Fragmen yang dihentikan |
| masih hidup (semua status dan informasi anggota masih disimpan oleh sistem). Akan tetapi, fragmen |
| tidak terlihat lagi oleh pengguna dan akan dimatikan jika aktivitas dimatikan.</dd> |
| </dl> |
| |
| <p>Seperti halnya aktivitas, Anda bisa mempertahankan status fragmen menggunakan {@link |
| android.os.Bundle}, jika proses aktivitas dimatikan dan Anda harus memulihkan status |
| fragmen bila aktivitas dibuat kembali. Anda bisa menyimpan status selama callback {@link |
| android.app.Fragment#onSaveInstanceState onSaveInstanceState()} fragmen dan memulihkannya selama |
| {@link android.app.Fragment#onCreate onCreate()}, {@link |
| android.app.Fragment#onCreateView onCreateView()}, atau {@link |
| android.app.Fragment#onActivityCreated onActivityCreated()}. Untuk informasi selengkapnya tentang menyimpan |
| status, lihat dokumen <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Aktivitas</a> |
| .</p> |
| |
| <p>Perbedaan paling signifikan dalam daur hidup antara aktivitas dan fragmen ada |
| pada cara penyimpanannya dalam back-stack masing-masing. Aktivitas ditempatkan ke back-stack aktivitas |
| yang dikelola oleh sistem saat dihentikan, secara default (sehingga pengguna bisa mengarah kembali |
| 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>). |
| Akan tetapi, fragmen yang ditempatkan ke back-stack dikelola oleh aktivitas host hanya saat |
| Anda secara eksplisit meminta agar instance disimpan dengan memanggil {@link |
| android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} selama transaksi yang |
| menghapus fragmen.</p> |
| |
| <p>Jika tidak, pengelolaan daur hidup fragmen mirip sekali dengan mengelola daur hidup |
| aktivitas. Jadi, praktik yang sama untuk <a href="{@docRoot}guide/components/activities.html#Lifecycle">mengelola daur hidup |
| aktivitas</a> juga berlaku untuk fragmen. Namun yang perlu juga Anda pahami adalah bagaimana hidup |
| aktivitas memengaruhi hidup fragmen.</p> |
| |
| <p class="caution"><strong>Perhatian:</strong> Jika Anda memerlukan objek {@link android.content.Context} |
| dalam {@link android.app.Fragment}, Anda bisa memanggil {@link android.app.Fragment#getActivity()}. |
| Akan tetapi, berhati-hatilah memanggil {@link android.app.Fragment#getActivity()} hanya bila fragmen |
| terkait dengan aktivitas. Bila fragmen belum terkait, atau terlepas selama akhir daur |
| hidupnya, {@link android.app.Fragment#getActivity()} akan kembali nol.</p> |
| |
| |
| <h3 id="CoordinatingWithActivity">Mengoordinasi dengan daur hidup aktivitas</h3> |
| |
| <p>Daur hidup aktivitas tempat fragmen berada akan memengaruhi langsung siklus hidup |
| fragmen sedemikian rupa sehingga setiap callback daur hidup aktivitas menghasilkan callback yang sama untuk masing-masing |
| fragmen. Misalnya, bila aktivitas menerima {@link android.app.Activity#onPause}, masing-masing |
| fragmen dalam aktivitas akan menerima {@link android.app.Fragment#onPause}.</p> |
| |
| <p>Namun fragmen memiliki beberapa callback daur hidup ekstra, yang menangani interaksi |
| unik dengan aktivitas untuk melakukan tindakan seperti membangun dan memusnahkan UI fragmen. Metode callback |
| tambahan ini adalah:</p> |
| |
| <dl> |
| <dt>{@link android.app.Fragment#onAttach onAttach()}</dt> |
| <dd>Dipanggil bila fragmen telah dikaitkan dengan aktivitas ({@link |
| android.app.Activity} diteruskan di sini).</dd> |
| <dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt> |
| <dd>Dipanggil untuk membuat hierarki tampilan yang dikaitkan dengan fragmen.</dd> |
| <dt>{@link android.app.Fragment#onActivityCreated onActivityCreated()}</dt> |
| <dd>Dipanggil bila metode {@link android.app.Activity#onCreate |
| onCreate()} aktivitas telah dikembalikan.</dd> |
| <dt>{@link android.app.Fragment#onDestroyView onDestroyView()}</dt> |
| <dd>Dipanggil bila hierarki tampilan yang terkait dengan fragmen dihapus.</dd> |
| <dt>{@link android.app.Fragment#onDetach onDetach()}</dt> |
| <dd>Dipanggil bila fragmen diputuskan dari aktivitas.</dd> |
| </dl> |
| |
| <p>Aliran daur hidup fragmen, karena dipengaruhi oleh aktivitas host-nya, diilustrasikan oleh |
| gambar 3. Dalam gambar ini, Anda bisa melihat bagaimana setiap status aktivitas menentukan |
| metode callback mana yang mungkin diterima fragmen. Misalnya, saat aktivitas menerima call back {@link |
| android.app.Activity#onCreate onCreate()}, fragmen dalam aktivitas akan menerima tidak lebih |
| dari callback {@link android.app.Fragment#onActivityCreated onActivityCreated()}.</p> |
| |
| <p>Setelah status aktivitas diteruskan kembali, Anda bisa bebas menambah dan menghapus fragmen untuk |
| aktivitas tersebut. Sehingga, hanya saat aktivitas berada dalam status dilanjutkan, daur hidup fragmen bisa |
| berubah secara independen.</p> |
| |
| <p>Akan tetapi, saat aktivitas meninggalkan status dilanjutkan, fragmen akan kembali didorong |
| melalui daur hidupnya oleh aktivitas.</p> |
| |
| |
| |
| |
| <h2 id="Example">Contoh</h2> |
| |
| <p>Untuk merangkum semua yang telah dibahas dalam dokumen ini, berikut ini contoh aktivitas |
| yang menggunakan dua fragmen untuk membuat layout dua panel. Aktivitas di bawah ini menyertakan satu fragmen untuk |
| menampilkan daftar putar Shakespeare dan fragmen lainnya menampilkan rangkuman pemutaran bila dipilih dari |
| daftar. Aktivitas ini juga menunjukkan cara menyediakan konfigurasi fragmen berbeda, |
| berdasarkan konfigurasi layar.</p> |
| |
| <p class="note"><strong>Catatan:</strong> Kode sumber lengkap untuk aktivitas ini tersedia di |
| <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html">{@code |
| FragmentLayout.java}</a>.</p> |
| |
| <p>Aktivitas utama akan menerapkan layout seperti biasa, selama {@link |
| android.app.Activity#onCreate onCreate()}:</p> |
| |
| {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java main} |
| |
| <p>Layout yang diterapkan adalah {@code fragment_layout.xml}:</p> |
| |
| {@sample development/samples/ApiDemos/res/layout-land/fragment_layout.xml layout} |
| |
| <p>Dengan layout ini, sistem akan membuat instance {@code TitlesFragment} (yang mencantumkan |
| judul) segera setelah aktivitas memuat layout, sementara {@link android.widget.FrameLayout} |
| (lokasi penempatan fragmen untuk menampilkan rangkuman pemutaran) menempati ruang di sisi kanan |
| layar, namun pada awalnya masih kosong. Seperti yang akan Anda lihat di bawah ini, sampai pengguna memilih item |
| dari daftar maka fragmen baru akan ditempatkan ke dalam {@link android.widget.FrameLayout}.</p> |
| |
| <p>Akan tetapi, tidak semua konfigurasi layar cukup lebar untuk menampilkan |
| daftar putar dan rangkuman secara berdampingan. Sehingga, layout di atas hanya digunakan untuk konfigurasi |
| layar mendatar, dengan menyimpannya di {@code res/layout-land/fragment_layout.xml}.</p> |
| |
| <p>Sehingga, bila layar berada dalam orientasi tegak, sistem akan menerapkan layout berikut, yang |
| tersimpan di {@code res/layout/fragment_layout.xml}:</p> |
| |
| {@sample development/samples/ApiDemos/res/layout/fragment_layout.xml layout} |
| |
| <p>Layout ini hanya menyertakan {@code TitlesFragment}. Ini artinya saat perangkat berada dalam |
| orientasi tegak, hanya judul daftar putar yang terlihat. Jadi, saat pengguna mengklik item |
| daftar dalam konfigurasi ini, aplikasi akan memulai aktivitas baru untuk menampilkan rangkuman, |
| sebagai ganti pemuatan fragmen kedua.</p> |
| |
| <p>Berikutnya, Anda bisa melihat bagaimana hal ini dilakukan dalam kelas fragmen. Pertama adalah {@code |
| TitlesFragment}, yang menampilkan judul daftar putar Shakespeare. Fragmen ini membuat ekstensi {@link |
| android.app.ListFragment} dan mengandalkannya itu untuk menangani sebagian besar pekerjaan tampilan daftar.</p> |
| |
| <p>Saat Anda memeriksa kode ini, perhatikan bahwa ada dua kemungkinan perilaku saat pengguna mengklik |
| item daftar: bergantung pada layout mana yang aktif, bisa membuat dan menampilkan fragmen |
| baru untuk menampilkan detail dalam aktivitas yang sama (menambahkan fragmen ke {@link |
| android.widget.FrameLayout}), atau memulai aktivitas baru (tempat fragmen ditampilkan).</p> |
| |
| {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java titles} |
| |
| <p>Fragmen kedua, {@code DetailsFragment} menampilkan rangkuman pemutaran untuk item yang dipilih dari |
| daftar dari {@code TitlesFragment}:</p> |
| |
| {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java details} |
| |
| <p>Ingatlah dari kelas {@code TitlesFragment}, bahwa, jika pengguna mengklik item daftar dan |
| layout saat ini <em>tidak</em> menyertakan tampilan {@code R.id.details} (yaitu tempat |
| {@code DetailsFragment} berada), maka aplikasi memulai aktivitas {@code DetailsActivity} |
| untuk menampilkan konten item.</p> |
| |
| <p>Berikut ini adalah {@code DetailsActivity}, yang hanya menanamkan {@code DetailsFragment} untuk menampilkan rangkuman pemutaran |
| yang dipilih saat layar dalam orientasi tegak:</p> |
| |
| {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java |
| details_activity} |
| |
| <p>Perhatikan bahwa aktivitas ini selesai sendiri jika konfigurasi mendatar, sehingga aktivitas utama |
| bisa mengambil alih dan menampilkan {@code DetailsFragment} bersama {@code TitlesFragment}. |
| Ini bisa terjadi jika pengguna memulai {@code DetailsActivity} saat dalam orientasi tegak, namun kemudian |
| memutarnya menjadi mendatar (yang akan memulai lagi aktivitas saat ini).</p> |
| |
| |
| <p>Untuk contoh lainnya mengenai penggunaan fragmen (dan file sumber lengkap untuk contoh ini), |
| lihat aplikasi contoh Demo API yang tersedia di <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment"> |
| ApiDemos</a> (bisa diunduh dari <a href="{@docRoot}resources/samples/get.html">Komponen contoh SDK</a>).</p> |
| |
| |