2012-09-20 8 views
6

किसी कारण से, onCreateOptionsMenu() को मेरे ऐप में onResume() के बाद कहा जाता है ... इसलिए, मैं अपने यूआई (onCreate() और onResume() के बीच) के दौरान मेनू को पकड़ नहीं पा रहा हूं, जिसके परिणामस्वरूप नहीं मेरे एक्शनबार के लिए संबंधित एक्शन आइटम सेट करने में सक्षम ...यूआई सेटअप समय पर एक्शनबार मेनू को पकड़ने के लिए कैसे?

एकमात्र काम-आसपास मुझे अब तक मिला है invalidateOptionsMenu()onCreate() रिटर्न से पहले मैन्युअल रूप से कॉल करना है; इस तरह onCreateOptionsMenu() तुरंत कॉल किया जाता है, मुझे मेनू की पकड़ मिलती है और फिर मैं वांछित एक्शन आइटम जोड़ सकता हूं।

क्या किसी ने इस समस्या का अनुभव किया है? के बाद onCreateOptionsMenu() को दिए गए आपके एक्शन आइटम्स को प्रोग्रामेटिक रूप से सेटअप करने के लिए आपको कैसे माना जाता है?

मेरा ऐप JellyBean पर चल रहा है, यह अंतर्निहित ActionBar (कोई ActionBarSherlock), android:minSdkVersion="14" और android:targetSdkVersion="16"

+0

त्वरित मानसिक स्वास्थ्य की जांच, आप * गतिविधि के बारे में बात कर रहे हैं * onCreate और onResume, है ना? Fragment –

+0

में संबंधित विधियों के विपरीत, आप 'ऑनक्रेटऑप्शनमेनू()' में मेनू आइटम क्यों सेट अप नहीं कर सकते हैं (इसे बाद में उपयोग के लिए मेनू के संदर्भ को संग्रहीत करने के बजाय) का उपयोग करने के बजाय? – user113215

+1

मैं उपयोगकर्ता 113215 के साथ हूं, आपको 'onResume()' में मेनू के बारे में क्यों पता होना चाहिए? यह सही प्रतीत नहीं होता है। – dmon

उत्तर

6

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

  • Action Bar API Guide से

    :

    एक सामान्य नियम के रूप में, (अकेले कार्रवाई आइटम हैं) विकल्प मेनू में सभी आइटम एप्लिकेशन पर एक वैश्विक असर होना चाहिए, न कि केवल एक छोटे से हिस्से को प्रभावित इंटरफ़ेस का। [...] तो, यह तय करने से पहले कि मेनू आइटम को एक्शन आइटम के रूप में दिखाना चाहिए या नहीं, सुनिश्चित करें कि आइटम की वर्तमान गतिविधि के लिए वैश्विक दायरा है।

  • Menu API Guide से:

    आप ध्यान में वर्तमान में View के आधार पर विकल्प मेनू में आइटम बदलने कभी नहीं करना चाहिए। जब टच मोड में (जब उपयोगकर्ता ट्रैकबॉल या डी-पैड का उपयोग नहीं कर रहा है), विचार फोकस नहीं ले सकते हैं, इसलिए आपको विकल्प मेनू में आइटम संशोधित करने के आधार के रूप में फ़ोकस का उपयोग कभी नहीं करना चाहिए। यदि आप मेनू आइटम प्रदान करना चाहते हैं जो View पर संदर्भ-संवेदनशील हैं, तो Context Menu का उपयोग करें।


कि वर्जित, आप मेनू आइटम को बदलने के लिए के रूप में आप का वर्णन किया है चाहते हैं, तो आप परिवर्तन onPrepareOptionsMenu() में बनाना चाहिए। जब ईवेंट होता है जिसके लिए मेनू आइटम को बदलने की आवश्यकता होती है, तो प्रासंगिक जानकारी को फ़ील्ड में रखें और invalidateOptionsMenu() पर कॉल करें। onPrepareOptionsMenu() ओवरराइड करें और यह निर्धारित करने के लिए फ़ील्ड का मान जांचें कि कौन से मेनू आइटम जोड़ने/निकालें।

(यह invalidateOptionsMenu() पर कॉल करने के लिए भी काम करेगा और onCreateOptionsMenu() को ओवरराइड करने के लिए संशोधित करेगा ताकि मेनू मेनू को दिखाया जाना चाहिए, हालांकि इस दृष्टिकोण की अनुशंसा नहीं की जाती है।) Menu API Guide से

अधिक:

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

यह विधि आपको Menu ऑब्जेक्ट पास करती है क्योंकि यह वर्तमान में मौजूद है, इसलिए आप आइटम को जोड़, निकालने या अक्षम करने जैसे इसे संशोधित कर सकते हैं। (टुकड़े भी एक onPrepareOptionsMenu() कॉलबैक प्रदान करते हैं।)

  • एंड्रॉयड 2.3.x और कम पर, सिस्टम कॉल onPrepareOptionsMenu() हर बार उपयोगकर्ता विकल्प मेनू खोलता है (मेनू बटन दबाता है)।

  • एंड्रॉइड 3.0 और उच्चतर पर, विकल्प मेनू को हमेशा माना जाता है जब मेनू आइटम क्रिया बार में प्रस्तुत किए जाते हैं। जब कोई ईवेंट होता है और आप मेनू अपडेट करना चाहते हैं, तो आपको invalidateOptionsMenu() पर कॉल करने के लिए सिस्टम कॉल onPrepareOptionsMenu() पर कॉल करना होगा।

+0

ग्रेट उत्तर, धन्यवाद आपके इनपुट के लिए बहुत कम :) –