2011-11-26 10 views
62

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

उत्तर

129

चूंकि क्रियाएं गतिविधि के विकल्प मेनू द्वारा पॉप्युलेट की जाती हैं, इसलिए आप Activity#invalidateOptionsMenu() का उपयोग कर सकते हैं। यह वर्तमान मेनू को डंप करेगा और इसे फिर से बनाने के लिए आपकी गतिविधि के onCreateOptionsMenu/onPrepareOptionsMenu विधियों को कॉल करेगा।

यदि आप अपने खंड विन्यास को बदलने के लिए एक्शन बार टैब का उपयोग कर रहे हैं तो बेहतर तरीका है। प्रत्येक टुकड़ा मेनू के अपने हिस्से का प्रबंधन करें। इन टुकड़ों को setHasOptionsMenu(true) पर कॉल करना चाहिए। जब विकल्प मेनू आइटम वाले टुकड़े जोड़े जाते हैं या हटा दिए जाते हैं तो सिस्टम स्वचालित रूप से विकल्प मेनू को अमान्य कर देगा और गतिविधि के अतिरिक्त प्रत्येक खंड के onCreateOptionsMenu/onPrepareOptionsMenu विधियों को कॉल करेगा। इस तरह प्रत्येक टुकड़ा अपनी वस्तुओं का प्रबंधन कर सकता है और आपको हाथ से मेनू स्विचिंग करने की चिंता करने की आवश्यकता नहीं है।

+17

बस एक ध्यान दें: setHasOptionsMenu() के लिए [प्रलेखन] अनुसार onCreate में बुलाया जाना चाहिए (http://developer.android.com/guide/topics/fundamentals/fragments.html#ActionBar)। – Dave

+1

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

+2

मैं आपसे सहमत हूं, हालांकि दस्तावेज इसे ऐसा नहीं बनाते हैं। "इस विधि को कॉल प्राप्त करने के लिए, हालांकि, आपको setHasOptionsMenu() को ऑनक्रेट() ... के दौरान कॉल करना होगा। मुझे लगता है कि उनका मतलब है कि आपको setHasOptionsMenu() को कॉल करना होगा, लेकिन वे अनजाने में इसे बनाने के दौरान ध्वनि बनाते हैं() भी एक आवश्यकता थी। – Dave

1

ActionMode.invalidate() चाल थी। इसने फिर से बुलाए जाने के लिए onPrepareActionMode() का कारण बना दिया।

Activity#invalidateOptionsMenu() जब बहु-चयन के साथ सूची आइटम का उपयोग कर नहीं कारण onPrepareActionMode() लागू किया जा करने के लिए किया था।

शुरू में मेनू MenuItem जोड़े लेकिन इसके दृश्यताको गलत सेट:

+0

पर कॉल करें, मैं एक्शनमोड कैसे प्राप्त करूं? मेरे पास केवल एक्शनबार – eugene

+0

है एक्शनमोड PrepareActionMode (...) में पहला पैरामीटर है: http: // goo।gl/tMyBx –

+0

मैंने कभी भी PrepareAction –

15

Activity.invalidateOptionsMenu() एपीआई स्तर 11. वहाँ एक सरल समाधान जो पीछे की ओर संगत है है की आवश्यकता है। सच जब वांछित, MenuItem.setVisible()

+1

धन्यवाद। बस मामले में दूसरों की मदद करता है ... 'मेनू Item refreshItem = menu.findItem (R.id.action_refresh) रखें; ताज़ा करें Item.setVisible (झूठा); 'आपके' ऑन क्रिएटऑप्शनमेनू ' – AlvaroSantisteban

+0

@AlvaroSantisteban या '" एंड्रॉइड: दृश्यमान "=" झूठी "xml में –

1

Activity.invalidateOptionsMenu() उपयोग करने के लिए दृश्यता सेट एपीआई स्तर 11. उपयोग यह supportInvalidateOptionsMenu() का समर्थन पुस्तकालय संस्करण की आवश्यकता है।

AppCompatActivity activity = (AppCompatActivity) getActivity(); 
activity.supportInvalidateOptionsMenu(); 
संबंधित मुद्दे