2015-03-12 5 views
17

यह प्रश्न है कि यह पता लगाने के लिए कि कोई दृश्य संलग्न या अलग है या नहीं।विचार संलग्न और अलग कब होते हैं?

आम तौर पर, जब एक दृश्य संलग्न या अलग होता है? क्या इसके लिए कोई जीवन चक्र आरेख है?

स्पष्टीकरण के लिए, मैं क्या होता हूं जब मैं पृष्ठभूमि में भेजा गया गतिविधि, शीर्ष पर रखा गया अपारदर्शी दृश्य, GONE पर दृश्यता सेट, फुलाए गए, पैरेंट अलग, आदि देखें। यह एक संपूर्ण सूची नहीं है - I बस समझना चाहते हैं कि विचारों को कैसे जोड़ना और अलग करना एक मौलिक स्तर पर काम करता है।

क्या टुकड़े बनाम गतिविधियों के बारे में:

मैं क्या पर पाने के लिए कोशिश कर रहा हूँ की अधिक उदाहरण के साथ अद्यतन?
नेस्टेड विचारों के बारे में क्या - किस क्रम में संलग्न/अलग किए गए विचार हैं (माता-पिता-> बच्चे या बच्चे-> अभिभावक)?
क्या वे जुड़े हुए हैं या बाद में विचार किए गए विचार हैं?
मैन्युअल रूप से ViewVroup में addView() का उपयोग करने के बारे में क्या?

संपादित करें: सारांश:

  • क्रियाएँ के लिए, विचारों setContentView() में जुड़े होते हैं। दृश्य onDestroy() में अलग किए गए हैं या जब setContentView() को एक अलग दृश्य के साथ बुलाया जाता है।
  • टुकड़ों के लिए, विचार after onViewCreated() finishes संलग्न हैं, और onDestroyView() खत्म होने के बाद अलग हो गए हैं।
  • ViewGroups के लिए, विचारों addView() में जुड़ा हुआ है और removeView()
  • setVisibility() में अलग कर रहे हैं एक दृश्य

उत्तर

32

के संलग्न राज्य को प्रभावित नहीं करता आधिकारिक दस्तावेज से:

एक गतिविधि एक भी है , केंद्रित चीज जो उपयोगकर्ता कर सकता है। लगभग सभी गतिविधियों उपयोगकर्ता के साथ बातचीत ...

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

आपके प्रश्न पर आगे बढ़ना - उस समय एक गतिविधि को एक गतिविधि से जोड़ा जाता है जब आप सेट कॉन्टेन्ट व्यू (व्यू) कहते हैं। इसे आमतौर पर ऑनक्रेट() विधि के भीतर बुलाया जाता है। आपके पास आमतौर पर ऑनक्रेट() विधि में यह कारण है क्योंकि प्रारंभिकता में से अधिकांश वहां किया जाता है। और यदि दृश्य को फुलाया नहीं गया है और गतिविधि से जुड़ा हुआ है तो आप अपने विजेट्स को कैसे प्रारंभ कर सकते हैं? इसलिए, यदि आपके पास कोई विचार है, तो आप लगभग सभी अनावश्यक होने से पहले अपने ऑनक्रेट() विधि के अंदर सेटकंटेंट व्यू() को कॉल करने के लिए लगभग अविश्वसनीय अंत तक पहुंच सकते हैं।

लेकिन क्या इसका मतलब यह है कि दृश्य (यदि यह मौजूद है) गतिविधि केवल ऑनक्रेट() विधि के भीतर बंधे होना चाहिए?

इस प्रश्न का उत्तर देने के लिए, देखते हैं कि किसी गतिविधि का जीवन चक्र कैसा दिखता है।आप अपने ऐप शुरू:

OnCreate() -> onStart() -> onResume() // वे लगातार कहा जाता हो

मंच आप में है, जहां सभी विजेट प्रारंभ कर दिया है अब कर रहे हैं ।

तो क्यों नहीं चलते हैं और गतिविधि को रेस्यूम() में संलग्न करते हैं और सभी प्रारंभिकरण करते हैं?

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

एक अपारदर्शी दृश्य आता है और गतिविधि पृष्ठभूमि, लेकिन अभी भी (इनकमिंग फ़ोन कॉल या खोलने एक और गतिविधि की तरह) चल रहा में है जब क्या होता है?

अब निम्न कॉलबैक होती हैं:

onPause() -> onStop()

जब आप मूल गतिविधि

onRestart() को वापस ले जाने - > ऑनस्टार्ट() -> ऑनस्यूम()

उसी कारण से जैसा मैंने उल्लेख किया है() में आप यहां एक लेआउट फुलाए और संलग्न नहीं करना चाहते हैं।

लेकिन जब गतिविधि पृष्ठभूमि में होती है तो लेआउट के साथ क्या होता है। लेआउट अभी भी संलग्न है?

हां, यह बहुत अधिक है। यदि कोई अन्य गतिविधि आती है जो मूल गतिविधि के समान लेआउट का उपयोग करती है, तो नई गतिविधि में इसका अपना लेआउट होता है और लेआउट का कोई साझाकरण नहीं होता है।

क्या होता है यदि उपयोगकर्ता पीछे बटन दबाकर गतिविधि को समाप्त करता है?

onBackPressed() विधि कस्टम व्यवहार प्राप्त करने के लिए ओवरराइड नहीं है OnDestroy ((इस स्थिति में, यह ऊपर grabs के लिए है),) मान लिया जाये कि कहा जाता है और गतिविधि नष्ट हो जाता है और वहाँ कोई अब और इसके साथ जुड़े दृश्य है ।

पृष्ठभूमि में गतिविधि कब होती है और एंड्रॉइड जीसी गतिविधि को नष्ट करने और संसाधनों को पुनः प्राप्त करने का निर्णय लेता है?

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

जब मैं अपने डिवाइस को घुमाता हूं तो क्या होता है?

एंड्रॉइड काम करने का तरीका वास्तव में वर्तमान गतिविधि को नष्ट करना और नए लेआउट को फिर से भरना और ऑनक्रेट() विधि से फिर से शुरू करना है। तो क्या तकनीकी रूप से होता है:

onPause() -> onStop() -> OnDestroy() -> OnCreate() -> onStart() -> onResume()

क्योंकि इस की , आप लैंडस्केप मोड में एक अलग लेआउट भी देख सकते हैं और देख सकते हैं।

संपादित करें: गतिविधियों, टुकड़ों और विचारों के बीच संबंध जोड़ा गया एक टुकड़ा स्क्रीन पर एक भाग (या व्यवहार) का प्रतिनिधित्व करता है। पूर्ण स्क्रीन पर कब्जा करने के लिए एक टुकड़ा बनाया जा सकता है या आप एक गतिविधि के भीतर कई टुकड़े हो सकते हैं। टुकड़ों का अपना जीवन चक्र होता है लेकिन यह मेजबान गतिविधि के जीवन चक्र (और इस उत्तर के दायरे से बाहर) से निकटता से जुड़ा हुआ है।)

  • onViewCreated()

    • onCreateView (

    तरीकों में कहा जाता है: जब से हम विशेष रूप से विचारों के बारे में बात कर रहे हैं, मैं दो हित के तरीकों को यह जवाब तक सीमित कर देगा निम्नलिखित आदेश:

    ऑनएट() -> ऑनक्रेट() -> ऑनक्रेट व्यू() -> ऑनव्यूक्रेटेड()

    आप ऑनक्रेट व्यू() के भीतर वास्तविक लेआउट मुद्रास्फीति करते हैं और फिर आप ऑनव्यूक्रेटेड() विधि के भीतर प्रारंभिक कार्य करते हैं। एंड्रॉइड द्वारा दृश्य को बढ़ाने के लिए onCreateView() विधि का परिणाम उपयोग किया जाता है।

    तो गतिविधि द्वारा पहली जगह में टुकड़ा कब बनाया गया है?

    टुकड़े प्रदर्शित करने के दो तरीके हैं - एक उन्हें गतिविधि के एक्सएमएल लेआउट के भीतर रखना है (बस विजेट नाम के बजाय, किसी भी नियमित विजेट की तरह, आप पूरी तरह से योग्य पैकेज नाम का उपयोग करेंगे खंड वर्ग) या आप प्रोग्रामेटिक रूप से FragmentManager का उपयोग करके अतिरिक्त कर सकते हैं (जो पसंदीदा तरीका है)।

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

    OnCreate() [गतिविधि] -> onAttach() [टुकड़ा] -> OnCreate() [टुकड़ा] -> onCreateView() [टुकड़ा] -> onViewCreated() [टुकड़ा] -> onStart() [गतिविधि] -> onResume() [गतिविधि] -> onActivityCreated() [टुकड़ा]

    तो पहला टुकड़ा दृश्य instantiated और इससे पहले कि टुकड़ा से जुड़ा हुआ है गतिविधि की onStart() विधि बनाई गई है।

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

    नेस्टेड दृश्य, नेस्टेड टुकड़े इत्यादि के बारे में क्या?

    नेस्टेड विचारों में, दूसरे के अंदर एक लेआउट कंटेनर की तरह, पैरेंट कंटेनर के नियम तत्काल बाल कंटेनर पर लागू होते हैं। हमेशा माता-पिता को पहले शुरू किया जाता है। तो लिनियरलाउट के अंदर एक विजेट के लिए, माता-पिता लिनियरलाउट का निर्माण पहले तुरंत बच्चे के बाद किया जाता है। ऐसे विचारों को नष्ट करते समय, जब माता-पिता अस्तित्व में रहते हैं तो सब कुछ जाता है। मैंने किसी ऑब्जेक्ट के बारे में किसी भी दस्तावेज के बारे में नहीं पढ़ा है जिसमें यह हो सकता है। एंड्रॉइड जीसी के पास नियम हो सकते हैं लेकिन मुझे यकीन नहीं है कि उन्हें कहीं भी दस्तावेज किया गया है या नहीं।

    आप भी घोंसले वाले टुकड़े कर सकते हैं - इस मामले में, बच्चे के टुकड़े से पहले पैरेंट खंड शुरू हो जाता है (और यह समझ में आता है?)। जब एक माता-पिता का टुकड़ा अस्तित्व में रहता है, तो बच्चा भी अस्तित्व में रहेगा। बच्चा माता-पिता के बिना अस्तित्व में नहीं हो सकता है लेकिन आप बच्चे के बिना माता-पिता हो सकते हैं।

    नेस्टेड विचारों के लिए नीचे की रेखा यह है कि एक बार जब मूल दृश्य नष्ट हो जाता है, तो यह तुरंत इसके साथ बच्चे को देखता है।

    क्या वे जुड़े हुए हैं या बाद में विचार किए गए विचार हैं?

    दृश्य संलग्न होने के बाद उपाय हैं। कॉलिंग getMeausredWidth() या getMeasuredHeight() इससे पहले शून्य वापस आ जाएगा। लेकिन आप जो कुछ भी कर सकते हैं, उसे कॉल करने से पहले सीधे दृश्य पर कॉल() को कॉल करें और कुछ बाधाओं को सेट करने के लिए मेजरस्पेक्स (मैं आपको आधिकारिक दस्तावेज़ों में इस पर और अधिक पढ़ना चाहूंगा) पास कर दूंगा। लेकिन यह विकल्प मूर्ख प्रमाण नहीं है क्योंकि यह माता-पिता ViewGroup पर निर्भर करता है जो इसकी अपनी बाधाओं को लागू करता है जो उच्च प्राथमिकता लेता है। अपने प्रश्न का उत्तर देने के लिए, संलग्न होने के बाद विचारों को मापा जाता है।

    व्यू ग्रुप मैन्युअल रूप से दृश्य जोड़ने के लिए addView() का उपयोग करने के बारे में क्या?

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

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

  • +0

    धन्यवाद, आपका उत्तर गतिविधियों के लिए सहायक है, लेकिन मैं उससे अधिक जानना चाहता हूं। टुकड़ों के बारे में क्या? घोंसले के विचारों के बारे में क्या - किस क्रम में विचार संलग्न हैं (माता-पिता-> बच्चे या बच्चे-> अभिभावक)? क्या वे जुड़े हुए हैं या बाद में विचारों को मापा जाता है? ViewVroup में addView() का उपयोग करने के बारे में क्या? मैं अधिक विशिष्टताओं के साथ प्रश्न अद्यतन करूंगा। – William

    +0

    ठीक है .. मैंने आपके अन्य सवालों के जवाब देने के उत्तर में और अधिक जोड़ा। मुझे बताएं कि क्या इससे मदद मिली है या अगर ऐसा कुछ है जिसे आप संबोधित करना चाहते हैं। – ucsunil

    +0

    ग्रेट उत्तर, धन्यवाद। दृश्यता बदलने के लिए मेरे पास एकमात्र अन्य प्रश्न है, लेकिन आपके उत्तर से ऐसा लगता है कि दृश्यता परिवर्तन इसे प्रभावित नहीं करते हैं – William

    संबंधित मुद्दे