47

'dan önce FragmentActivity ve Fragments kullanıyorum.Döndükten sonra onCreate() FragmentActivity

uygulama başlar:

FragmentActivity onCreate() <------ 
FragmentActivity onStart() 
FragmentActivity onResume() 
Fragment onAttach() 
Fragment onCreate() <------ 
Fragment onCreateView() 
Fragment onActivityCreated() 
Fragment onStart() 
Fragment onResume() 

Hiçbir sorun yok, FragmentActivity onCreate() Fragman onCreate önce denir(). Ve döndüğünde:

Fragment onPause() 
FragmentActivity onPause() 
Fragment onStop() 
FragmentActivity onStop() 
Fragment onDestroyView() 
Fragment onDestroy() 
Fragment onDetach() 
FragmentActivity onDestroy() 
--- 
Fragment onAttach() 
Fragment onCreate() <---------- 
FragmentActivity onCreate() <--------- 
Fragment onCreateView() 
Fragment onActivityCreated() 
Fragment onStart() 
FragmentActivity onStart() 
FragmentActivity onResume() 
Fragment onResume() 

Fragment onCreate() FragmentActivity onCreate önce denir(). Neden tutarsız?

FragmentActivity onCreate() Fragment onCreate() öğesinin aldığı bazı verileri oluşturuyorum. Bu garip davranıştan dolayı, veriyi daha önce oluşturduğumdan emin olmak için kodumu Fragment onCreate() 'dan Fragment onCreateView()' a taşımak zorunda kaldım.

Fragmentleri tutmak için FragmentStatePagerAdapter kullanıyorum, belki nedeni nedir?

+0

Peki, sen ne yapıyorsun? Çözelti? – levi

+0

@levi Görünümlerinizi onActivityCreated() Fragmanı yöntemindeki verilerle doldurun. Veya mimarinizi yeniden düşünün, çoğu durumda verilerinizi ana etkinlikten almak zorunda kalmazsınız. ListView/RecyclerView dinamik verilere sahipseniz Loader'ları kullanın. Bu benim nihai çözümümdü, çünkü her parçada List vardı. Ayrıca daha temiz mimariye sahip olması için mesaj veri yolu kütüphanesini (EventBus, Otto, ...) kullanabilirsiniz. – AppiDevo

cevap

56

Parçanın yaşam döngüsünde onActivityCreated() çağrısına kadar geçerli bir Etkinliğe güvenmemelisiniz.

Parçaın etkinliği oluşturulduğunda ve bu parçanın görünüm hiyerarşisi başlatıldığında çağrılır. Görünümler veya geri yükleme durumu gibi, bu parçalar yerleştirildikten sonra nihai başlatmayı yapmak için kullanılabilir.

Yeniden oluşturma sırasının neden doğrusal olmadığının kesin nedenleri, size söyleyemem. Her bir bileşenin, katı bir düzeni zorlamaktan ziyade kendi hızıyla yeniden başlamasını sağlamak daha etkilidir. Mesela, LoaderManager'ımın olabildiğince erken başlamasını tercih ediyorum ve içeriğin daha sonra içeriğiyle ilgili endişeleneceğiz.

(Ben iyi bir diyagram seviyorum.)

enter image description here

+0

Tatlı şeması, gerçekten temiz ve noktaya eve götürür. –

+0

Güzel Diyagram ve iyi bir örnek de – AshuKingSharma

+0

Daha önce değil, hata nedeniyle onActivityCreated() içinde Loders init güvenlidir. https://code.google.com/p/android/issues/detail?id=183783 – AppiDevo

25

fragmanlar Etkinlik en onCreate() sırasında geri yüklenir. Önemli olsa da, bunlar Aktivite sınıfının onCreate() tabanına geri yüklenir. Bu nedenle, önce super.onCreate()'u çağırırsanız, Fragmanlarınız geri yüklendikten sonra onCreate() yönteminizin geri kalanı işlenecektir.

olası bir çözüm o zaman senin Fragment Diyelim ki yaşam döngüsü şuna benzer super.onCreate()

diyoruz ÖNCE gerekecektir olduğunu Hiç veri durumunu geri yüklemek veya hesaplamaktır

:

ACTIVITY onCreate (pre-super) 
FRAGMENT onAttach 
ACTIVITY onCreate (post-super) 

Bunun gibi bir şey yap:

@Override 
public void onCreate(final Bundle savedInstanceState) 
{ 
    Log.d(TAG, "ACTIVITY onCreate (pre-super)"); 
    // Do your processing here 
    super.onCreate(savedInstanceState); // Fragments will be restored here 
    Log.d(TAG, "ACTIVITY onCreate (post-super)"); 
} 
+3

Bu cevap için yeterince teşekkür edemem. – user3213851

+3

Böyle bir soruna bir cevap için 2 gün boyunca arıyordu Bir kahraman vardır .... – Joakim

+1

Thankssss! benim düşünceme göre, bu kabul edilen yanıt olmalıdır – feresr

İlgili konular