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.

Jadi: apa perbedaan antara kedua metode ini?

yydl
sumber

Jawaban:

156

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

Rajdeep Dua
sumber
145
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:

onAttach()           
onCreate()           
onCreateView()       
onViewCreated()      
onActivityCreated()  
onViewStateRestored()
onStart()            
onResume()

mFragment.getView() == null: false                    
mFragment.getActivity() == null: false

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:

onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()

mFragment.getView() == null: true
mFragment.getActivity() == null: true

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:

onPause()                             
onStop()                              
onDestroyView()                      

mFragment.getView() == null: true
mFragment.getActivity() == null: false

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:

onCreateView()                        
onViewCreated()                       
onActivityCreated()                   
onViewStateRestored()                 
onStart()                             
onResume()                            

mFragment.getView() == null: false
mFragment.getActivity() == null: false

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.

Stephen
sumber
1
Kerja bagus. Tapi sepertinya cukup menarik mencoba memasang kembali dan menambahkan kembali memiliki efek yang sama setelah fragmen dihapus.
stdout
9
Jadi, ternyata "attach ()" tidak akan memanggil onAttach (). "detach ()" tidak akan memanggil onDetach ().
KunYu Tsai
1
Dan beberapa peristiwa siklus hidup ini bisa sedikit berubah jika Anda menyimpan transaksi di back-stack.
stdout