Android: जब onCreateOptionsMenu को गतिविधि जीवनचक्र के दौरान कहा जाता है?


149

मैंने ब्रेकपॉइंट की एक जोड़ी onCreate(शुरुआत में एक, और विधि के अंत में एक) डाल दी, और मैंने शुरुआत में एक भी डाल दिया onCreateOptionsMenuonCreateविधि पहले कहा जाता है, और इसके समाप्त होने से पहले किया जाता है onCreateOptionsMenuकहा जाता है।

मैं Fragmentअपने ऐप में नेविगेशन कोड को अलग करने की कोशिश कर रहा हूं , इसलिए मेरे पास कुछ ऑब्जेक्ट हैं जो मैं onCreateOptionsMenuइस पर निर्भर करता हूं कि क्या ऐप फोन / टैबलेट पर चल रहा है (मैं यह निर्धारित करने के लिए स्क्रीन आकार का उपयोग कर रहा हूं, मेरे लेआउट फ़ाइल के लिए बड़ी स्क्रीन में एक दृश्य है जो लेआउट के फुलाए जाने के बाद की जाँच करता है)। मुझे जो समस्या हो रही है, मैं इन वस्तुओं को ऑनक्रिएट में बनाता हूं, और जब मैं ऑब्जेक्ट को संदर्भित करता हूं तो मुझे एक शून्य पॉइंटर अपवाद मिल रहा है onCreateOptionsMenu

जवाबों:


112

OnCreate विधि को पहले कहा जाता है, और इससे पहले कि यह onCreateOptionsMenu खत्म हो जाता है।

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

(मैं यह निर्धारित करने के लिए स्क्रीन आकार का उपयोग कर रहा हूं, बड़ी स्क्रीन के लिए मेरी लेआउट फ़ाइल में एक लेआउट है जिसे लेआउट के फुलाए जाने के बाद मैं देख सकता हूं)

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


मैं यह उल्लेख करना भूल गया कि मैं ActionbarSherlock लाइब्रेरी का उपयोग कर रहा हूं। आपके उत्तर ने मुझे याद दिलाया। शायद यह व्यवहार का कारण है, क्योंकि यह संगतता पुस्तकालय पर एक आवरण है, जो "एक्शनबेर" में मेनू आइटम डालता है।
क्रिस्टोफर पेरी

@commonsware - इसका मतलब है कि उन डिवाइसों और ऐप्स पर जिनमें एक्शन बार नहीं है। मेनू दिखाई देगा भले ही onCreateOptionsMenu में आइटम दिखाई न दें?
निंजाकोडर

12
मेरे मामले में onCreateMenu onResume के बाद फोन करें
Kostya Khuta

1
हां, मुझे वही समस्या है ... लेकिन मेरा कोड एक फ़्रैगमेंट से संबंधित है।
योआन हरकौट

NPEजब nav drawer fragmentखुला था तो मुझे चेक करने लगा onCreateOptionsMenu। मुझे गतिविधि के onCreateOptionsMenu, और साथ ही उस कॉलबैक का उपयोग करना पड़ा, जो खंड अपने onCreateOptionsMenu में उपयोग कर रहा था। वास्तव में अजीब है क्योंकि यह केवल कुछ स्क्रीन पर हो रहा था, लेकिन लगातार उन पर।
दिबांग

54

एंड्रॉइड 2.3 पर मेरे मामले में और FragmentActivityv4- सपोर्ट लाइब्रेरी से जीवन-चक्र विधियों के आह्वान का क्रम निम्नलिखित है:

07-18 18:29:21.629  20183-20183/? I/onCreate:
07-18 18:29:21.719  20183-20183/? I/onStart: 
07-18 18:29:21.719  20183-20183/? I/onResume: 
07-18 18:29:21.739  20183-20183/? I/onCreateOptionsMenu:

27

मैंने पाया अगर onResume () मैं कॉल करता हूं

invalidateOptionsMenu();

फिर onCreateOptionsMenu (मेनू मेनू) को बाद में कहा जाता है - गतिविधि जीवन चक्र के अनुसार (मुझे लगता है कि यहां सही शब्द है) , जैसा कि @ tir38 द्वारा इंगित किया गया है

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}

4
यदि आप एक्शनबर्सलॉक का उपयोग कर रहे हैं, तो इस विधि को कॉल करेंsupportInvalidateOptionsMenu();
शान ज़ीशी

3
"तुरंत" कहने पर सावधान रहें। यह वास्तव में तुरंत नहीं होगा। जब आप invalidateOptionsMenu, विकल्प मेनू बनाने के लिए एक नौकरी (यूआई) यूआई के संदेश कतार में जोड़ा जाएगा। जो कुछ भी कतार में है वह पहले चला जाएगा।
tir38

21

उपरोक्त उत्तर में परिवर्धन, ICS और हनीकॉम्ब के मामले में onCreateOptionsMenu को onCreate और onPostCreate के बाद कहा जाता है जबकि जिंजरब्रेड और इससे पहले के संस्करणों में इसे onCreate के बाद, लेकिन PPostCreate के पहले कहा जाता है। मुझे केवल यही अंतर मिला।


3

ActionBarActivityसमर्थन v7 से मेरे अनुभव में इसके बीच onCreateOptionsMenu()में setContentView()विधि में बुलाया onCreate()4.1.1 पर दिखाई देता है।

लेकिन 4.4 के onCreateOptionMenu()बाद एक और कहानी है onCreate()। इसके अलावा, मुझे नहीं पता कि यह तुरंत बाद हो सकता है, शायद नहीं। लेकिन तथ्य के बाद है। मैंने अन्य संस्करणों पर परीक्षण नहीं किया था, लेकिन 4.1.1 वह जगह है जहां मुझे init ऑर्डर से परेशानी हुई।


शायद आपको उपयोग करने की आवश्यकता है supportInvalidateOptionsMenu()?
डेविड डी सी ई फ्रीटास

2

मैं onResume () और onCreateOptionsMenu () के साथ समय के मुद्दों से बचने के लिए आपके टुकड़े में एक कॉलबैक-फ़ंक्शन बनाने का सुझाव देता हूं।

निम्नलिखित कार्य मेरे लिए निर्दोष हैं:

  1. अपनी गतिविधि में अपना अंश बनाएं और जोड़ें
  2. अपनी गतिविधि में इस टुकड़े का एक संदर्भ छोड़ दें
  3. अपने टुकड़े में एक सार्वजनिक विधि doSomethingWithTheMenu () बनाएँ
  4. अपनी गतिविधि के भीतर से इस पद्धति को कॉल करें जब onCreateOptionsMenu (मेनू मेनू) कहा जाता है।

उदाहरण:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.