1) fragmentTransaction.addToBackStack(str);
Deskripsi - Tambahkan transaksi ini ke tumpukan belakang. Ini berarti bahwa transaksi akan diingat setelah dilakukan, dan akan membalik operasinya ketika kemudian muncul dari tumpukan.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Deskripsi - Ganti fragmen yang ada yang ditambahkan ke wadah. Ini pada dasarnya sama dengan memanggil remove (Fragment) untuk semua fragmen yang saat ini ditambahkan yang ditambahkan dengan containerViewId yang sama dan kemudian tambahkan (int, Fragment, String) dengan argumen yang sama yang diberikan di sini.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Deskripsi - Tambahkan fragmen ke status aktivitas. Fragmen ini secara opsional juga memiliki tampilan (jika Fragment.onCreateView mengembalikan non-null) ke tampilan wadah dari aktivitas.
Apa artinya mengganti fragmen yang sudah ada, dan menambahkan fragmen ke status aktivitas dan menambahkan aktivitas ke tumpukan belakang?
Ada tumpukan di mana semua kegiatan dalam keadaan berjalan disimpan. Fragmen milik aktivitas. Jadi, Anda dapat menambahkan mereka untuk menanamkannya dalam suatu aktivitas.
Anda dapat menggabungkan beberapa fragmen dalam satu aktivitas untuk membangun UI multi-pane dan menggunakan kembali fragmen dalam beberapa aktivitas. Ini pada dasarnya berguna ketika Anda telah mendefinisikan wadah fragmen Anda di tata letak yang berbeda. Anda hanya perlu mengganti dengan fragmen lain dalam tata letak apa pun.
Saat Anda menavigasi ke tata letak saat ini, Anda memiliki id wadah itu untuk menggantinya dengan fragmen yang Anda inginkan.
Anda juga dapat kembali ke fragmen sebelumnya di backStack dengan popBackStack()
metode ini. Untuk itu Anda perlu menambahkan fragmen itu di stack menggunakan addToBackStack()
dan kemudian commit()
merefleksikannya. Ini dalam urutan terbalik dengan arus di atas.
findFragmentByTag apakah pencarian untuk tag ini ditambahkan oleh metode add / replace atau metode addToBackStack?
Jika tergantung pada bagaimana Anda menambahkan tag. Itu kemudian hanya menemukan sebuah fragmen dengan tag yang Anda tetapkan sebelumnya baik ketika dipompa dari XML atau seperti yang disediakan saat ditambahkan dalam transaksi.
Referensi: Transaksi Fragment
Satu lagi perbedaan penting antara
add
danreplace
ini:replace
menghapus fragmen yang ada dan menambahkan fragmen baru. Ini berarti ketika Anda menekan tombol kembali fragmen yang diganti akan dibuat dengan ituonCreateView
dipanggil. Sedangkanadd
mempertahankan fragmen yang ada dan menambahkan fragmen baru yang berarti fragmen yang ada akan aktif dan mereka tidak akan dalam keadaan 'dihentikan sementara' maka ketika tombol kembali ditekanonCreateView
tidak dipanggil untuk fragmen yang ada (fragmen yang ada di sana sebelum fragmen baru itu ditambahkan).Dalam hal peristiwa siklus hidup fragmen
onPause
,onResume
,onCreateView
dan peristiwa siklus hidup lainnya akan dipanggil dalam kasusreplace
tetapi mereka wont dipanggil dalam kasusadd
.Sunting : Seseorang harus berhati-hati jika dia menggunakan semacam perpustakaan bus acara seperti Greenrobot's Eventbus dan menggunakan kembali fragmen yang sama untuk menumpuk fragmen di atas yang lain melalui
add
. Dalam skenario ini, meskipun Anda mengikuti praktik terbaik dan mendaftarkan bus peristiwa masukonResume
dan membatalkan pendaftaranonPause
, bus peristiwa masih akan aktif di setiap contoh fragmen yang ditambahkan sebagaiadd
fragmen tidak akan memanggil salah satu metode siklus hidup fragmen ini. Sebagai hasilnya, pendengar bus acara di setiap instance fragmen yang aktif akan memproses acara yang sama yang mungkin bukan yang Anda inginkan.sumber
Contoh suatu kegiatan memiliki 2 fragmen dan kami menggunakan
FragmentManager
untuk mengganti / menambahkan denganaddToBackstack
masing - masing fragmen ke tata letak dalam aktivitasGunakan ganti
Go Fragment1
Go Fragment2
Fragmen Pop2
Fragmen Pop1
Gunakan add
Go Fragment1
Go Fragment2
Fragmen Pop2
Fragmen Pop1
Proyek sampel
sumber
onPause()
seharusnya dipanggil sebelumnyaonStop()
pada setiap aksi Pop ?Meskipun ini adalah pertanyaan lama yang sudah dijawab, mungkin contoh-contoh berikut dapat melengkapi jawaban yang diterima dan mereka dapat berguna bagi beberapa programmer baru di Android seperti saya.
Opsi 1 - "addToBackStack ()" tidak pernah digunakan
Kasus 1A - menambah, menghapus, dan mengklik tombol Kembali
Kasus 1B - menambah, mengganti, dan mengklik tombol Kembali
Opsi 2 - "addToBackStack ()" selalu digunakan
Kasus 2A - menambah, menghapus, dan mengklik tombol Kembali
Kasus 2B - menambah, mengganti, menghapus, dan mengklik tombol Kembali
Opsi 3 - "addToBackStack ()" tidak digunakan selalu (dalam contoh di bawah, w / o menunjukkan bahwa itu tidak digunakan)
Kasus 3A - menambah, menghapus, dan mengklik tombol Kembali
Kasus 3B - menambah, mengganti, menghapus, dan mengklik tombol Kembali
sumber
Perbedaan mendasar antara
add()
danreplace()
dapat digambarkan sebagai:add()
digunakan untuk menambahkan fragmen ke beberapa elemen root.replace()
berperilaku serupa tetapi pada awalnya menghapus fragmen sebelumnya dan kemudian menambahkan fragmen berikutnya.Kita dapat melihat perbedaan yang tepat ketika kita gunakan
addToBackStack()
bersama denganadd()
ataureplace()
.Ketika kita menekan tombol kembali setelah dalam kasus
add()
... onCreateView tidak pernah dipanggil, tetapi dalam kasusreplace()
, ketika kita menekan tombol kembali ... oncreateView dipanggil setiap waktu.sumber
Ketika Kami Menambahkan Fragmen Pertama -> Fragmen Kedua menggunakan metode add ()
Saat kami menggunakan add () dalam fragmen
Saat kami menggunakan replace () dalam fragmen
pergi ke fragmen pertama ke fragmen kedua di Pertama -> Kedua menggunakan metode replace ()
Dalam kasus Replace First Fragment, metode ini disebut ekstra (onPause, onStop, onDestroyView disebut ekstra)
E / Keshav FirstFragment: onPause
E / Keshav FirstFragment: onStop
E / Keshav FirstFragment: onDestroyView
sumber
Fungsi menambah dan mengganti FragmentManger dapat digambarkan sebagai 1. add ini berarti akan menambahkan fragmen dalam tumpukan kembali fragmen dan akan ditampilkan pada bingkai tertentu yang Anda sediakan seperti
getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)
2.replace berarti Anda mengganti fragmen dengan fragmen lain pada frame yang diberikan
getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)
Utilitas utama di antara keduanya adalah bahwa ketika Anda kembali menumpuk, penggantian akan menyegarkan fragmen tetapi menambahkan tidak akan menyegarkan fragmen sebelumnya.
sumber
Hal penting yang harus diperhatikan:
Perbedaan antara Ganti dan Ganti dengan backstack adalah setiap kali kita menggunakan hanya mengganti maka fragmen dihancurkan (ondestroy () dipanggil) dan ketika kita menggunakan ganti dengan backstack maka fragmen onDestroy () tidak disebut (yaitu ketika tombol kembali ditekan fragmen dipanggil dengan onCreateView ())
sumber
Berikut adalah gambar yang menunjukkan perbedaan antara
add()
danreplace()
Jadi
add()
metode terus menambahkan fragmen di atas fragmen sebelumnya di FragmentContainer.Sementara
replace()
metode menghapus semua Fragmen sebelumnya dari Kontainer dan kemudian menambahkannya di FragmentContainer.Apa itu addToBackStack
addtoBackStack
metode dapat digunakan dengan add () dan ganti metode. Ini melayani tujuan yang berbeda di Fragment API.Apa tujuannya?
API Fragmen tidak seperti API Aktivitas tidak datang dengan navigasi Tombol Kembali secara default. Jika Anda ingin kembali ke Fragmen sebelumnya maka kita menggunakan metode addToBackStack () di Fragment. Mari kita mengerti keduanya
Kasus 1:
Kasus 2:
sumber