Android Parçaları: Ne zaman gizle / göster veya ekle / kaldır / değiştir kullanılır?


117

Bazı kapsayıcı görünümlerindeki mevcut parçayı bir başkasıyla değiştirmek istediğimi varsayalım. Değiştirmek daha mı iyi?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... veya aşağıdaki, göster ve gizle ile?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

Bunu yapmanın bir yolu daha verimli mi? Bu yöntemlerin ne zaman kullanılacağına veya ilgili parçaların yaşam döngüsünü nasıl etkilediğine dair fazla bilgi bulamıyorum. Teşekkürler!


A parçasından B parçasına gidip sonra A parçasına geri dönersem, onCreateView gibi yaşam döngüsü olayının A parçasında çağrı olmadığından nasıl emin olabilirim? etikete göre parça buluyor mu?
blackHawk

Yanıtlar:


135

Hangi yolu izleyeceğinize karar vermek için parça ile ne yapmayı planladığınızı düşünmelisiniz. Parçayı gizlemek için bir FragmentTransaction kullanırsanız, o zaman yaşam döngüsünün çalışma durumunda olabilir, ancak kullanıcı arabirimi pencereden ayrılmış olduğundan artık görünmez. Böylece, teknik olarak parçayla hala etkileşim kurabilir ve daha sonra ihtiyacınız olan kullanıcı arayüzünü yeniden ekleyebilirsiniz. Parçayı değiştirirseniz, aslında onu kabın dışına çekiyorsunuzdur ve yaşam döngüsündeki tüm sökülme olaylarından geçecektir (onPause, onStop, vb.) Ve herhangi bir nedenle bu parçaya tekrar ihtiyacınız olursa tekrar kabın içine yerleştirin ve tüm başlatma işleminden tekrar geçmesine izin verin.

Bu parçaya tekrar ihtiyaç duyma olasılığınız yüksekse, saklayın çünkü düzenini yeniden çizmek, tamamen yeniden başlatmaktan daha ucuz bir işlemdir.


5
İhtiyaçlarımız için, parçayı başlatmak oldukça pahalıdır, bu yüzden muhtemelen devam edeceğiz hide()ve bundan show()tasarruf edeceğiz ! Bunun için teşekkürler!
Robert Karl

2
Merhaba, pencereden ayır derken, onDetach () geri aramasının çağrılacağını mı kastediyorsunuz? Bunu denedim, öyle değil gibi görünüyor.
GingerJim

muhtemelen "ayırmak" demek istedi; bir parça da ayrılabilir / yeniden eklenebilir (ek olarak ekleme / kaldırma, gösterme / gizleme)
comeGetSome

1
@Zainodis, bende de aynı sorun var. Çözümüm, parçanın gizli durumunu onSaveInstanceState () - kaydedilenInstanceState.putBoolean (STATE_HIDDEN, isHidden ()) içine kaydetmek; daha sonra onCreate () 'de (SavedInstanceState! = null) gizli durumu geri alırsa ve parça gizliyse işlemle birlikte gizler.
worawee.s

1
@ worawee.s Hey orada ve güncelleme için teşekkürler :)! Sorunu bir süre önce çözdüm - gerçekten gizle / göster vb. İhtiyacım yoktu, bu yüzden tamamen bıraktım ve şimdi tek bölmede ekle / değiştir veya tek parça etkinlikleri gibi standartlarla gidiyorum (temelde ana ayrıntı akışı) . Hala hide kullananlar için çözümünüz gerçekten yardımcı olacaktır - ve SavedInstance! = Null öğesini kontrol etmemek daha önce yaptığım hatalardan biriydi.
AgentKnopf

5

Temelde kendinize cevap verdiniz. Değiştirmek istiyorsanız (artık eski parçaya gerek yok) replace(), geçici olarak gizlemek istiyorsanız kullanın, sonra yapın hide().


Temel olarak değiştir, removeAll'ı sağlar. Eşleşen hideAll :(
AlikElzin-kilaka'yı bulamadım

@ AlikElzin-kilaka Faaliyetimde her üç parçadaki 3 parça ağdan hangi yöntemi izlemeliyim
Mansukh Ahir

0

Gizle / Göster yöntemini 4 parça ile etkinliğimde çözdüm, çözümümü çözdü, ancak diyaloğumu gösterdiğimde rastgele bir şekilde, ekle ve değiştir yöntemini kullandığımda pencere kötü simge istisnası veriyor, sonra kötü simge istisnası oluşmuyor, bu yüzden göster / gizle yöntemi mükemmel değil

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.