Bir Parçayı ayırmakla onu çıkarmak arasındaki fark nedir?


118

FragmentTransaction için Android belgelerinde çok benzer iki yöntem fark ettim: detachve remove. Buradaki açıklamalar, her birinin ne zaman kullanılacağı konusunda çok fazla fikir vermiyor gibi görünüyor ve söyleyebileceğim şey aynı görünüyor.

Öyleyse: bu iki yöntem arasındaki farklar nelerdir?

Yanıtlar:


156

Detach yöntemi, parçayı kullanıcı arabiriminden kaldırır, ancak durumu Parça Yöneticisi tarafından korunur. Bu, değiştirilmiş bir ViewHierarchy ile attach yöntemini çağırarak bu parçayı yeniden kullanabileceğiniz anlamına gelir.

Kaldır, parça örneğinin yeniden eklenemeyeceği anlamına gelir. Parça işlemine tekrar eklemeniz gerekecek.

Kaynak Yorum

Bir Fragment ayrıldığında, onPause, onStop ve onDestroyView yöntemlerinin yalnızca çağrıldığını fark edeceksiniz (bu sırada). Öte yandan, bir Fragment kaldırıldığında onPause, onStop, onDestroyView, onDestroy ve onDetach yöntemleri çağrılır (bu sırayla). Benzer şekilde, eklerken Fragment'ın onCreateView, onStart ve onResume yöntemleri yalnızca çağrılır; ve eklerken Fragment'ın onAttach, onCreate, onCreateView, onStart ve onResume yöntemleri çağrılır (bu sırayla). - Adil Hussain


145
Rajdeep cevabı eklemek için, bir zaman fark edeceksiniz Fragmentedilir müstakil , onun onPause, onStopve onDestroyViewyöntemleri (bu sırayla) yalnızca denir. Bir diğer taraftan, Fragmentbir çıkarılmış olan, onPause, onStop, onDestroyView, onDestroyve onDetach(bu sırayla) yöntemleri olarak adlandırılır. Benzer şekilde, bağlama , Fragment'nin onCreateView, onStartve onResumeyöntemleri sadece olarak adlandırılır; ne zaman ve ekleme , Fragment'in onAttach, onCreate, onCreateView, onStartve onResumeyöntemleri (bu sırayla) olarak adlandırılır.
Adil Hussain

1
Burada Diane Hackborn ile hızlı bir Soru-Cevap var . Öyleyse neden bu kütüğe sahibim ? FT.detach () 'ın çağrıldığını nasıl anlarsınız?
Poutrathor

1
Birinin diğerine faydası nedir? Biri diğerine göre daha uygun olduğunda bir kullanım durumu bilmek istiyorum. Her zaman eklerim ve çıkarırım, bu kötü mü?
Neon Warge

1
En iyi kısa ve öz açıklama.
Robotec

55

Mesaj panolarındaki Google mühendislerine göre bile parça yönetim yöntemlerinin adlandırılması çok kafa karıştırıcıdır (yukarıdaki yorumlara bakın). İşlerin gerçekte nasıl çalıştığını anlamak için kendime küçük bir demo yaptım. İşte bulgularım. Hatalıysam beni düzeltmekten çekinmeyin.

Bir Aktiviteye başlangıçta bir Parça eklemek için şunu kullanırsınız: getFragmentManager (). BeginTransaction (). Add (R.id.container, mFragment) .commit ().

Bu, Aktiviteyi Parça ile ilişkilendirir ve ayrıca bir Görünümü Parça ile ilişkilendirir.

Ortaya çıkan yaşam döngüsü olayları ve diğer önemli yöntem dönüş değerleri şunlardır:

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

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

Bir Etkinlikten bir Parçayı kaldırmak için şunu kullanırsınız: getFragmentManager (). BeginTransaction (). Remove (mFragment) .commit ().

Bu, bir Görünüm veya bir Aktivite ile herhangi bir ilişkiyi kaldırır.

Ortaya çıkan yaşam döngüsü olayları ve diğer önemli yöntem dönüş değerleri şunlardır:

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

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

Parçayı buraya yeniden ekledim

Bir Etkinlikten eklenen bir Parçayı ayırmak için şunu kullanırsınız: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().

Bu, bir Görünüm ile herhangi bir ilişkiyi kaldırır, ancak Aktivite ile olan ilişkiyi korur.

Ortaya çıkan yaşam döngüsü olayları ve diğer önemli yöntem dönüş değerleri şunlardır:

onPause()                             
onStop()                              
onDestroyView()                      

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

Activity'den ayrılan bir Parçayı yeniden eklemek için şunu kullanırsınız: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().

Bu, Parça ile ilişkilendirmek için yeni bir Görünüm oluşturur ve Aktivite ilişkisini korur.

Ortaya çıkan yaşam döngüsü olayları ve diğer önemli yöntem dönüş değerleri şunlardır:

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

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

Dikkat edilmesi gereken diğer önemli noktalar: Bir Parçayı çıkarırsanız ve daha sonra attach () yerine add () kullanarak tekrar eklemeye çalışırsanız, hiçbir şey değişmeyecek gibi görünecektir.

remove () kullanarak, add () yerine attach () kullanarak kaldırılmış bir Parça eklemeye çalışırsanız, hiçbir şey değişmeyecek gibi görünür.

GetView () null döndürdüğünde, Fragment hala oluşturduğu son Görünüme dahili referanslara sahip olabilir. Bu Görünüm artık geçerli değildir ve kullanılmamalıdır.


1
İyi iş. Ancak, parça kaldırıldıktan sonra yeniden eklemeyi ve yeniden eklemeyi denemek oldukça ilginç görünüyordu.
stdout

9
Dolayısıyla, "attach ()" öğesinin onAttach () öğesini çağırmayacağı ortaya çıktı. "detach ()", onDetach () öğesini çağırmaz.
KunYu Tsai

1
Ve bu yaşam döngüsü olaylarından bazıları, işlemleri arka yığında tutarsanız biraz değişebilir.
stdout
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.