Apa perbedaan antara melepaskan Fragmen dan menghapusnya?
118
Dalam dokumen Android untuk FragmentTransaction, saya melihat dua metode yang sangat mirip: detachdan remove. Deskripsi di sana tampaknya tidak memberikan banyak wawasan tentang kapan harus menggunakan masing-masing, dan dari apa yang dapat saya katakan bahwa semuanya tampak sama.
Metode pelepasan menghapus fragmen dari UI, tetapi statusnya dipertahankan oleh Fragment Manager. Artinya, Anda dapat menggunakan kembali fragmen ini dengan memanggil metode lampirkan, dengan ViewHierarchy yang dimodifikasi
Hapus berarti instance fragmen tidak dapat dipasang kembali. Anda harus menambahkannya lagi ke transaksi fragmen.
Komentar Sumber
Anda akan melihat bahwa ketika Fragment dilepas, metode onPause, onStop, dan onDestroyView-nya hanya dipanggil (dalam urutan itu). Di sisi lain, saat Fragmen dihapus, metode onPause, onStop, onDestroyView, onDestroy, dan onDetach-nya dipanggil (dalam urutan itu). Demikian pula, saat melampirkan, metode onCreateView, onStart, dan onResume Fragmen hanya dipanggil; dan saat menambahkan, metode onAttach, onCreate, onCreateView, onStart, dan onResume Fragmen dipanggil (dalam urutan itu). - Adil Hussain
Untuk menambah jawaban Rajdeep, Anda akan melihat bahwa ketika Fragmentsedang terpisah , yang onPause, onStopdan onDestroyViewmetode dipanggil hanya (dalam urutan itu). Di sisi lain, ketika Fragmentsedang dihapus , yang onPause, onStop, onDestroyView, onDestroydan onDetachmetode yang disebut (dalam urutan itu). Demikian pula, saat melampirkan , Fragment's onCreateView, onStartdan onResumemetode hanya dipanggil; dan ketika menambahkan , para Fragment's onAttach, onCreate, onCreateView, onStartdan onResumemetode yang disebut (dalam urutan itu).
Adil Hussain
1
Ada Tanya Jawab cepat dengan Diane Hackborn di sini . Jadi mengapa saya memiliki log ini ? Bagaimana Anda tahu bahwa FT.detach () telah dipanggil?
Poutrathor
1
Apa manfaat yang satu dibandingkan yang lain? Saya ingin mengetahui kasus penggunaan ketika salah satu lebih disukai daripada yang lain? Saya selalu menambah dan menghapus, apakah itu buruk?
Neon Warge
1
Klarifikasi singkat dan ringkas terbaik.
Robotec
55
Penamaan metode manajemen fragmen sangat membingungkan bahkan menurut teknisi Google di papan pesan (lihat komentar di atas). Saya membuat sendiri demo kecil untuk mencari tahu cara kerja sebenarnya. Inilah temuan saya. Jangan ragu untuk mengoreksi saya jika saya salah.
Untuk awalnya menambahkan Fragmen ke Aktivitas, Anda menggunakan: getFragmentManager (). BeginTransaction (). Add (R.id.container, mFragment) .commit ().
Ini mengaitkan Aktivitas dengan Fragmen dan juga mengaitkan Tampilan dengan Fragmen.
Berikut adalah peristiwa siklus hidup yang dihasilkan dan nilai pengembalian metode penting lainnya:
Untuk memasang kembali Fragmen yang telah dilepas ke Aktivitas, Anda menggunakan: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().
Ini membuat Tampilan baru untuk dikaitkan dengan Fragmen dan mempertahankan asosiasi Aktivitas.
Berikut adalah peristiwa siklus hidup yang dihasilkan dan nilai pengembalian metode penting lainnya:
Hal penting lainnya yang perlu diperhatikan: Jika Anda melepaskan Fragmen lalu mencoba menambahkannya lagi menggunakan add () daripada melampirkan (), sepertinya tidak ada yang berubah.
jika Anda mencoba menambahkan Fragmen yang telah dihapus menggunakan remove () dengan menggunakan attach () daripada add (), tidak ada yang berubah.
Saat getView () mengembalikan null, Fragmen mungkin masih memiliki referensi internal ke Tampilan terakhir yang dibuatnya. Tampilan ini tidak lagi valid dan tidak boleh digunakan.
Fragment
sedang terpisah , yangonPause
,onStop
danonDestroyView
metode dipanggil hanya (dalam urutan itu). Di sisi lain, ketikaFragment
sedang dihapus , yangonPause
,onStop
,onDestroyView
,onDestroy
danonDetach
metode yang disebut (dalam urutan itu). Demikian pula, saat melampirkan ,Fragment
'sonCreateView
,onStart
danonResume
metode hanya dipanggil; dan ketika menambahkan , paraFragment
'sonAttach
,onCreate
,onCreateView
,onStart
danonResume
metode yang disebut (dalam urutan itu).Penamaan metode manajemen fragmen sangat membingungkan bahkan menurut teknisi Google di papan pesan (lihat komentar di atas). Saya membuat sendiri demo kecil untuk mencari tahu cara kerja sebenarnya. Inilah temuan saya. Jangan ragu untuk mengoreksi saya jika saya salah.
Untuk awalnya menambahkan Fragmen ke Aktivitas, Anda menggunakan: getFragmentManager (). BeginTransaction (). Add (R.id.container, mFragment) .commit ().
Ini mengaitkan Aktivitas dengan Fragmen dan juga mengaitkan Tampilan dengan Fragmen.
Berikut adalah peristiwa siklus hidup yang dihasilkan dan nilai pengembalian metode penting lainnya:
Untuk menghapus Fragmen dari Aktivitas, Anda menggunakan: getFragmentManager (). BeginTransaction (). Remove (mFragment) .commit ().
Ini menghapus asosiasi apa pun dengan Tampilan atau Aktivitas.
Berikut adalah peristiwa siklus hidup yang dihasilkan dan nilai pengembalian metode penting lainnya:
Saya menambahkan kembali fragmen di sini
Untuk melepaskan Fragmen tambahan dari sebuah Aktivitas, Anda menggunakan: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().
Ini menghapus asosiasi apa pun dengan Tampilan, tetapi tetap mengaitkannya dengan Aktivitas.
Berikut adalah peristiwa siklus hidup yang dihasilkan dan nilai pengembalian metode penting lainnya:
Untuk memasang kembali Fragmen yang telah dilepas ke Aktivitas, Anda menggunakan: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().
Ini membuat Tampilan baru untuk dikaitkan dengan Fragmen dan mempertahankan asosiasi Aktivitas.
Berikut adalah peristiwa siklus hidup yang dihasilkan dan nilai pengembalian metode penting lainnya:
Hal penting lainnya yang perlu diperhatikan: Jika Anda melepaskan Fragmen lalu mencoba menambahkannya lagi menggunakan add () daripada melampirkan (), sepertinya tidak ada yang berubah.
jika Anda mencoba menambahkan Fragmen yang telah dihapus menggunakan remove () dengan menggunakan attach () daripada add (), tidak ada yang berubah.
Saat getView () mengembalikan null, Fragmen mungkin masih memiliki referensi internal ke Tampilan terakhir yang dibuatnya. Tampilan ini tidak lagi valid dan tidak boleh digunakan.
sumber