Mengelola fragment
Untuk mengelola fragment pada activity, kita perlu menggunakan FragmentManager
. untuk mendapatkannya, panggil metode getFragmentManager()
dari activity. Ada tiga hal yang bisa kita lakukan dengan FragmentManager
, yang sangat membantu dalam pengelolaan fragment.
- Mendapatkan fragment yang berada dalam activity, menggunakan
findFragmentById()
(jika fragment memiliki UI), ataufindFragmentByTag()
(jika fragment tidak memiliki UI). - Mengeluarkan fragment dari backstack, dengan
popBackStack()
(mensimulasikan perintah Kembali oleh user). - Mendaftarkan sebuah Listener jika ada perubahan ke backstack, dengan
addOnBackStackChanedListener()
FragmentManager
untuk membuka sebuah FragmentTransaction
, sehingga kita bisa melakukan transaksi, misalnya menambah dan menghapus fragment.
Melakukan transaksi fragment
Manfaat dari menggunakan fragment adalah kita bisa menambah, menghapus, menukar, dan melakukan hal-hal lainnya, sebagai respon dari interaksi user. Setiap perubahan yang kita lakukan terhadap activity, disebut transaksi dan kita bisa melakukannya dengan menggunakan API dalam FragmentTransaction
. Kita juga bisa menyimpan setiap transaksi ke dalam backstack yang dikelola oleh activity, sehingga user bisa kembali ke keadaan sebelum fragment diubah.
Kita bisa memperoleh sebuah instansi dari FragmentTransaction
dari FragmentManager
sebagai berikut:
FragmentManager managerFragment = getFragmentManager();
FragmentTransaction transaksiFragment = managerFragment.beginTransaction();
Setiap transaksi adalah sekumpulan perubahan yang dilakukan secara bersamaan. Kita bisa mensetup semua perubahan yang ingin kita lakukan untuk transaksi yang terjadi menggunakan metode seperti add()
, remove()
, dan replace()
. Kemudian, untuk menerapkan transaksi tersebut ke activity, kita harus memanggil commit()
.
Sebelum memanggil commit()
, sebaiknya kita memanggil addToBackStack()
terlebih dahulu, untuk menambahkan transaksi ke dalam back stack transaksi fragment. Back stack ini dikelola oleh activity dan user bisa kembali ke keadaan fragment sebelum diubah dengan menekan tombol Kembali.
Sebagai contoh, berikut ini adalah cara mengganti suatu fragment dengan fragment lainnya, dan menyimpan keadaan fragment sebelumnya di back stack:
// membuat fragment dan transaksi baru
Fragment fragmentBaru = new ContohFragment();
FragmentTransaction transaksi = getFragmentManager().beginTransaction();
// Mengganti apapun yang berada dalam tampilan fragment_container dengan fragment ini,
// dan menambahkan transaksi ke back stack
transaksi.replace(R.id.fragment_container, fragmentBaru);
transaksi.addToBackStack(null);
// Melakukan transaksi
transaksi.commit();
Dalam contoh ini, fragmentBaru
menggantikan apapun fragment (jika ada) yang sedang berada di layout diidentifikasikan dengan ID R.id.fragment_container
. Dengan kita memanggil addToBackStack()
, transaksi pergantian fragment tersimpan ke back stack jadi user bisa membalik transaksi dan kembali ke fragment yang sebelumnya dengan menekan tombol Kembali.
Jika kita menambahkan beberapa perubahan ke transaksi (misalnya menambah lagi add()
atau remove()
) dan memanggil addToBackStack()
, maka semua perubahan yang diterapkan sebelum kita memanggil commit()
ditambahkan ke back stack sebagai satu transaksi dan tombol Kembali akan membalik semuanya bersamaan.
Urutan penambahan perubahan ke FragmentTransaction
tidak menjadi masalah, asalkan:
- Kita harus memanggil
commit()
di bagian paling akhir. - Jika kita menambahkan beberapa fragment ke dalam container yang sama, maka urutan penambahan akan sama dengan urutan fragment ditampilkan dalam hierarki tampilan.
Jika kita tidak memanggil addToBackStack()
ketika melakukan sebuah transaksi yang menghapus fragment, maka fragment tersebut akan dihapus dan setelah transaksi dilakukan user tidak bisa kembali ke fragment tersebut. Tapi jika kita memanggil metode addToBackStack()
ketika menghapus fragment, maka fragment distop dan akan diresume jika user menekan tombol Kembali.
Tip: Untuk setiap transaksi fragment, kita bisa memberikan animasi transaksi, dengan memanggilsetTransition()
sebelum memanggil metodecommit()
.
Meskipun sudah memanggil commit()
, bukan berarti transaksi akan langsung terjadi. Namun metode tersebut menjadwalkan transaksi agar berjalan pada thread UI milik activity (thread "main") segera setelah thread bisa melakukan perubahan tersebut. Bila perlu, kita bisa memanggil executePendingTransaction()
dari thread UI agar segera mengeksekusi transaksi yang di jadwalkan oleh commit()
. Biasanya kita tidak perlu melakukan hal ini, kecuali transaksi tersebut adalah sebuah dependency untuk pekerjaan di thread lain.
Perhatian: kita tidak bisa melakukan transaksi hanya menggunakancommit()
saja karena kemampuan activity untuk menyimpan keadaannya ketika user meninggalkan activity (pada pembahasan post sebelumnya). Jika kita melakukan transaksi setelah activity menyimpan keadaannya, sebuah exception akan dilemparkan. Hal ini karena keadaan setelah transaksi bisa hilang jika activity akan dikembalikan. Jika tidak masalah untuk kehilangan transaksi, gunakancommitAllowingStateLoss()
.
Tweet
Tidak ada komentar:
Posting Komentar