47

से पहले बुलाया जाता है, मैं फ्रैगमेंट एक्टिविटी और फ्रैगमेंट्स का उपयोग कर रहा हूं।घुमाने के बाद, क्रिएट() फ्रैगमेंट को क्रिएट() फ्रैगमेंट एक्टिविटी

जब आवेदन शुरू होता है:

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

सब कुछ ठीक है, FragmentActivity OnCreate() टुकड़ा onCreate से पहले कहा जाता है()। और जब मैं बारी बारी से:

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() 

टुकड़ा OnCreate() FragmentActivity onCreate से पहले कहा जाता है()। यह असंगत क्यों है?

फ्रैगमेंट एक्टिविटी ऑनक्रेट() में मैं कुछ डेटा उत्पन्न करता हूं, जो फ्रैगमेंट ऑनक्रेट() हो जाता है। उस अजीब व्यवहार के कारण मुझे यह सुनिश्चित करने के लिए कि मेरा डेटा पहले उत्पन्न हुआ था, मुझे यह सुनिश्चित करने के लिए फ्रैगमेंट ऑनक्रेट() से फ्रैगमेंट ऑनक्रेट व्यू() तक अपना कोड ले जाना पड़ा।

मैं FragmentStatePagerAdapter का उपयोग टुकड़ों को पकड़ने के लिए कर रहा हूं, शायद यही कारण है?

+0

तो, आप क्या हैं आर समाधान? – levi

+0

@levi अपने विचारों को डेटा पर डेटा के साथ पॉप्युलेट करें() फ्रैगमेंट की विधि। या अपने आर्किटेक्चर पर पुनर्विचार करें, ज्यादातर मामलों में आपको मेजबान गतिविधि से अपना डेटा प्राप्त करने की आवश्यकता नहीं है। और यदि आपके पास डायनामिक डेटा के साथ ListView/RecyclerView है तो लोडर का उपयोग करें। यह मेरा अंतिम समाधान था क्योंकि मेरे पास हर टुकड़े में सूची थी। आप क्लीनर आर्किटेक्चर के लिए संदेश बस लाइब्रेरी (इवेंटबस, ओटो, ...) का भी उपयोग कर सकते हैं। – AppiDevo

उत्तर

56

आपको onActivityCreated() फ्रैगमेंट के जीवन चक्र में कॉल तक वैध गतिविधि पर भरोसा नहीं करना चाहिए।

जब खंड की गतिविधि बनाई गई है और इस खंड के दृश्य पदानुक्रम को तुरंत चालू किया गया है तो कॉल किया गया। इन टुकड़ों के स्थान पर एक बार अंतिम प्रारंभ करने के लिए इसका उपयोग किया जा सकता है, जैसे विचारों को पुनर्प्राप्त करना या राज्य को बहाल करना।

पुनर्निर्माण आदेश रैखिक नहीं होने के सटीक कारण हैं, मैं आपको नहीं बता सकता। यह शायद अधिक कुशल है कि प्रत्येक घटक को कठोर क्रम को मजबूर करने के बजाए अपनी गति से फिर से शुरू करने दें। उदाहरण के लिए, मैं पसंद करता हूं कि मेरा लोडर मैनेजर जितनी जल्दी हो सके शुरू हो और हम इसकी सामग्री बाद में के लिए लेआउट के बारे में चिंता करेंगे।

(मैं एक अच्छा चित्र प्यार करता हूँ।)

enter image description here

+0

स्वीट आरेख, वास्तव में यह स्पष्ट करता है और बिंदु को घर चलाता है। –

+0

नाइस आरेख, और काफी अच्छा चित्रण भी – AshuKingSharma

+0

बग के कारण एक्टिविटी क्रेटेड() में लॉडर को इनिट करना सुरक्षित है, पहले नहीं। https://code.google.com/p/android/issues/detail?id=183783 – AppiDevo

25

टुकड़े गतिविधि के onCreate() दौरान बहाल कर रहे हैं। महत्वपूर्ण बात यह है कि, उन्हें बेस एक्टिविटी क्लास के onCreate() में बहाल किया जाता है। इस प्रकार यदि आप पहले super.onCreate() पर कॉल करते हैं, तो आपके शेष onCreate() विधि आपके शेष को पुनर्स्थापित करने के बाद निष्पादित हो जाएंगी।

एक संभव समाधान तो अपने राज्य बहाल करने या गणना करने के लिए जो भी डेटा यह अपने टुकड़ा के की आवश्यकता होगी इससे पहले कि आप कॉल super.onCreate()

जीवन चक्र इस तरह दिखता है:

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

तो ऐसा कुछ करें:

@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

मैं इस उत्तर के लिए आपको धन्यवाद नहीं दे सकता। ऐसी समस्या के उत्तर के लिए 2 पूरे दिन खोज रहे थे – user3213851

+3

आप नायक हैं .... – Joakim

+1

धन्यवादएसएस! मेरी राय में, यह स्वीकार्य उत्तर – feresr