OnCreateView और OnViewCreated के बीच अंतर


118

इन दोनों विधियों में आवश्यक अंतर क्या है? जब मैं एक TextView बनाते हैं, तो क्या मुझे प्रदर्शन के लिए एक दूसरे पर उपयोग करना चाहिए?

संपादित करें: इससे क्या अंतर है

onCreateView() {
  root = some view
  View v = new View(some context);
  root.add(v);
  return root;
}


onViewCreated() {
  View v = new View(some context);
  getView().add(v);
}

मैंने अपनी उलझन को समझाने के लिए एक एड किया। यदि एक विधि दूसरे के ठीक बाद आती है, तो दो क्यों हैं? क्या सभी दृश्य निर्माण एक ही तरीके से नहीं किए जा सकते जैसे कि ऊपर?
स्मिथ

7
यदि आपको Google और अनुमान लगाना है, तो संभवतः बुरी तरह से नामित विधियां हैं।
बलाज़ नेमेथ

जवाबों:


85

हम कुछ क्रैश दृश्य का सामना कर रहे हैं onCreateView

आप में अपने लेआउट बढ़ चाहिए onCreateViewलेकिन का उपयोग अन्य विचारों को प्रारंभ नहीं करना चाहिए findViewByIdमें onCreateView

क्योंकि कभी-कभी दृश्य को प्रारंभिक रूप से ठीक नहीं किया जाता है। तो हमेशा उपयोग findViewByIdमें onViewCreated(जब दृश्य पूरी तरह से बनाया जाता है) और यह भी पैरामीटर के रूप में देखने के लिए गुजरता है।

onViewCreated सुनिश्चित करें कि दृश्य पूरी तरह से बनाया गया है।

onViewCreated android प्रलेखन

के तुरंत बाद कहा जाता है onCreateView( android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) वापस आ गया है, लेकिन इससे पहले किसी भी बचाया राज्य को देखने के लिए में बहाल कर दिया गया। यह उपवर्गों को एक बार खुद को आरंभ करने का मौका देता है जब उन्हें पता चलता है कि उनका दृष्टिकोण पूरी तरह से बनाया गया है। इस बिंदु पर खंड के दृश्य पदानुक्रम को उसके माता-पिता के साथ संलग्न नहीं किया गया है।


4
धन्यवाद। मैंने इस समस्या का भी सामना किया और घटक का इस्तेमाल किया। post(...) दिखाने तक प्रतीक्षा करने की विधि। संभवतः findViewById और अन्य इनिशियलाइज़ेशन बना देगा onViewCreated
कूलमाइंड

22
वह पाठ कहाँ से उद्धृत किया गया था? मैं इसे आधिकारिक दस्तावेज में नहीं मिला।
डैनियल

क्या आप इस कथन के डेवलपर साइट से संदर्भ पोस्ट कर सकते हैं?
नम्रता बागवाल

4
यह वास्तव में सही नहीं है। आप onCreateView में एक दृश्य पा सकते हैं, लेकिन केवल आपके द्वारा फुलाए जाने के बाद और केवल उस दृश्य से जिसे आपने पहले ही फुलाया था। Fragment.findViewById () सुरक्षित नहीं है, लेकिन View.findViewById () सुरक्षित है यदि आपने पहले ही फ़्रेग्मेंट दृश्य को बढ़ा दिया है।
बृहस्पतिवार

46

onViewCreatedके तुरंत बाद कहा जाता है onCreateView(जिस विधि को आप शुरू करते हैं और अपनी सभी वस्तुओं को बनाते हैं, जिसमें आपकी TextView) भी शामिल है, इसलिए यह प्रदर्शन की बात नहीं है।

डेवलपर साइट से:

onViewCreated (देखें दृश्य, बंडल सहेजा गया है ।stanceState)

OnCreateView (LayoutInflater, ViewGroup, बंडल) के तुरंत बाद कॉल किया गया है, लेकिन दृश्य में किसी भी सहेजे गए राज्य को पुनर्स्थापित करने से पहले। यह उपवर्गों को एक बार खुद को आरंभ करने का मौका देता है जब उन्हें पता चलता है कि उनका दृष्टिकोण पूरी तरह से बनाया गया है। इस बिंदु पर खंड के दृश्य पदानुक्रम को उसके माता-पिता के साथ संलग्न नहीं किया गया है।

स्रोत: टुकड़ा # onViewCreated


28

इसमें फ़ील्ड के लिए किसी भी तरह के साक्षात्कार को करना बेहतर है onViewCreated। ऐसा इसलिए है क्योंकि यह सुनिश्चित करने के लिए कि आपके फ्रैगमेंट का दृश्य पदानुक्रम बनाया गया है और फुलाया गया है (यदि XML लेआउट फ़ाइल का उपयोग कर रहा है) ठीक से हो तो फ्रेमवर्क आपके लिए एक स्वत: रिक्त जांच करता है।

से कोड स्निपेट: FragmentManger.java

// This calls onCreateView()
f.mView = f.performCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState);

// Null check avoids possible NPEs in onViewCreated
// It's also safe to call getView() during or after onViewCreated()
if (f.mView != null) {
    f.mView.setSaveFromParentEnabled(false);
    if (f.mHidden) f.mView.setVisibility(View.GONE);
    f.onViewCreated(f.mView, f.mSavedFragmentState);
}

6
यह पदानुक्रम मुद्रास्फीति / सृजन तर्क से किसी भी आरंभिक तर्क को अलग करता है
orangemako

1
यह दिलचस्प है, क्या आपके पास कोई अतिरिक्त संसाधन हैं कि यह दृष्टिकोण बेहतर क्यों है? क्या इसका मतलब यह है कि हर onCreateView मेथड में केवल "रिटर्न इनफॉरमेट.इनफ्लिकेट (R.layout.layout_file, कंटेनर, गलत) शामिल होना चाहिए;" और onviewcreated में सभी "findViewById" विधियाँ होनी चाहिए? यह किस प्रदर्शन को बढ़ावा देता है? यह तेजी से बदलाव करना होगा?
android_student

आपके पहले प्रश्न का उत्तर देने के onCreateViewलिए, खंड के दृश्य पदानुक्रम बनाने के लिए उपयोग किया जाता है। यह XML मुद्रास्फीति या गतिशील निर्माण के माध्यम से हो सकता है (यानी, जावा विचारों को प्रोग्रामिक रूप से बनाना)। तो आप बिलकुल भी कॉल न करें inflate। लेकिन आपको कुछ माता-पिता के दृश्य को वापस करना चाहिए, अगर टुकड़े में एक यूआई तत्व होना चाहिए। नहीं तो लौटो null
ओरंगेमको

इसमें प्रदर्शन को बढ़ावा नहीं दिया गया है। के लिए FragmentManagerऔर विखंडन कोड को देखते हुए performCreateView, जो onCreateView github.com/android/platform_frameworks_base/blob/… कहता है , आपको onViewCreatedजीवनचक्र कॉलबैक के लिए कुछ चीजों की गारंटी दी जाती है :
orangemako

1. दृश्य पदानुक्रम कंटेनर से जुड़ा होगा यदि टुकड़ा गतिशील रूप से इसकी मूल गतिविधि में जोड़ा गया हो। 2. आप NPEs के बारे में चिंता किए बिना सुरक्षित रूप से लुकअप देख सकते हैं। 3. मैं एनिमेशन से परिचित नहीं हूं, लेकिन टुकड़ा संक्रमण पहले ही शुरू हो चुका होगा (यानी, यूआई थ्रेड संदेश कतार में भेज दिया गया)।
ओरंगेमको

13

onCreateViewफुलाया हुआ दृश्य लौटाता है। OnViewCreatedके बाद कहा जाता है onCreateViewऔर फुलाया दृश्य पैरामीटर है। इसका रिटर्न प्रकार हैvoid


1
मैंने अपनी उलझन को समझाने के लिए एक एड किया। यदि एक विधि दूसरे के ठीक बाद आती है, तो दो क्यों हैं? क्या सभी दृश्य निर्माण एक ही तरीके से नहीं किए जा सकते जैसे कि ऊपर?
स्मिथ

3
onCreateView को जल्दी लौटना चाहिए। उदाहरण के लिए, OnViewCreate का उपयोग इनिशियलाइज़ेशन सामान को करने के लिए किया जा सकता है। जैसा कि मैंने कहा, onViewCreated के पैरामीटर के रूप में आपके द्वारा onCreateView के अंदर फुलाया गया दृश्य है। तो आप getViewकॉल को टाल सकते हैं
Blackbelt

8

onCreateView()फ्रैगमेंट onCreate()गतिविधियों के लिए बराबर है और दृश्य निर्माण के दौरान चलता है । व्यू बनने के बाद
onViewCreated() चलता है ।

should I use one over the other for performance? सं । वहाँ एक प्रदर्शन को बढ़ावा देने का कोई सबूत नहीं है।

वहाँ वास्तव onCreate()में भी Fragments में एक विधि है, लेकिन यह शायद ही कभी इस्तेमाल किया जाता है (मैं इसका उपयोग कभी नहीं करते हैं, न ही इसके लिए एक अच्छा उपयोग मामला पाते हैं)।

मैं हमेशा onCreateView()एक प्रतिस्थापन के रूप में Fragments में उपयोग करता हूंonCreate()
और मैं इससे खुश हूं।


2
@npace, क्यों? मुझे भी लगता onCreateViewहै कि यह गतिविधि के बराबर है onCreate
कूलमाइंड

2
@CoolMind खैर, nPace पूरी तरह से गलत नहीं है, क्योंकि onCreate()Framents में भी एक तरीका है। लेकिन इसका इस्तेमाल कभी नहीं किया गया (या, कम से कम, मैं इसका इस्तेमाल कभी नहीं करता)। मैं हमेशा onCreateView()एक प्रतिस्थापन के रूप में Fragments में उपयोग करता हूं ।
फैंटमैक्सएक्स

1
@ रोवांग, आपसे सहमत हूँ! कुछ ट्यूटोरियल onCreate का उपयोग setHasOptionsMenu (सही) करने के लिए करते हैं, लेकिन मुझे लगता है कि यह onCreateView या onViewCreated में बेहतर करेगा।
कूलमाइंड

1
@CoolMind मैं पूरी तरह से सहमत हूँ। हो सकता है कि मैंने अपने उत्तर में गलत शब्दों का इस्तेमाल किया हो।
फैंटमैक्सएक्स

1
@ रतवांग, आपने सही कहा। जब मैंने पहली बार टुकड़ों का इस्तेमाल किया, तो मुझे यह भी नहीं पता था कि ऑनक्रिएट का उपयोग क्यों नहीं किया जाता है।
कूलमाइंड

4

Fragment.onCreateView()अब के लिए डॉक्स कहते हैं:

इस पद्धति में केवल लेआउट को बढ़ाने और तर्क को स्थानांतरित करने की सिफारिश की जाती है जो लौटे व्यू पर संचालित होता है onViewCreated (देखें, बंडल)।

हमें समझने की कोई आवश्यकता क्यों नहीं; हमें केवल डॉक्स के कहने की आवश्यकता है, लेकिन यह जानना दिलचस्प होगा कि यह सिफारिश क्यों मौजूद है। मेरा सबसे अच्छा अनुमान चिंता की जुदाई है , लेकिन IMHO इसे थोड़ा और अधिक जटिल बनाता है जितना कि यह होना चाहिए।


यदि कारण चिंता से अलग है, तो गतिविधि अपने लेआउट को setContentView()अंदर क्यों ले जाती है onCreate()?
मिन्ह नगूना

@ MinNghĩa अच्छी बात है। उस प्रश्न का उत्तर केवल यह हो सकता है कि इसे एक अलग प्रोग्रामर द्वारा अलग तरीके से सोचकर बनाया गया था (हम एंड्रॉइड मिलने के कुछ साल बाद ही टुकड़े पेश किए गए थे), लेकिन कौन जानता है।
पेप्पे एलजी

2

मुख्य कारण मैं इसका उपयोग करूंगा onViewCreatedक्योंकि यह पदानुक्रम मुद्रास्फीति / निर्माण तर्क को देखने से किसी भी आरंभीकरण तर्क को अलग करता है जिसे अंदर जाना चाहिए onViewCreate। अन्य सभी प्रदर्शन विशेषताएँ समान दिखती हैं।


2

मुझे लगता है कि इन के बीच मुख्य अलग है जब आप का उपयोग kotlin.in onCreateView () हर बार जब आप दृश्य की पहुंच अपने xml फ़ाइल में आप का उपयोग करना चाहिए करना चाहते हैं findViewById लेकिन में onViewCreated आप कर सकते हैं बस सिर्फ यह की आईडी को फोन करके अपने दृश्य की पहुंच ।


क्या यह वास्तव में सच है? अगर मैं अभी किसी तरह से कोड में आईडी का उपयोग करता हूं, तो मैं इस दृश्य के लिए अशक्त हो रहा हूं। मुझे हमेशा findViewById का उपयोग करना होगा।
जिम एलक

1
नहीं, यह नहीं है .. oncreate दृश्य को तुरंत दिखाता है, onviewcreated को oncreateview के बाद कहा जाता है और इससे पहले कि सहेजे गए राज्यों को पुनर्स्थापित किया जाता है ... यह टुकड़े के जीवनचक्र में अधिक समय का मुद्दा है
me_

1

onCreateView का उपयोग लेआउट बनाने और दृश्य को बढ़ाने के लिए किया जाता है। onViewCreated का उपयोग उपरोक्त विधि द्वारा बनाए गए दृश्य को संदर्भित करने के लिए किया जाता है। अंत में यह onActivityCreated में एक्शन श्रोता को परिभाषित करने के लिए एक अच्छा अभ्यास है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.