2012-07-07 21 views
7

में क्रिएटऑप्शन मैनेयू के बजाय ऑनपेरेपॉप्शनमेनू का उपयोग करना ActionBar में मुझे कुछ खंड मेनू आइटम सेट करने में समस्या थी और मुझे इसे हल करने का कोई तरीका मिला, लेकिन मुझे समझ में नहीं आया कि यह क्यों काम करता है।फ्रैगमेंट

onCreateOptionsMenu विधि में मेनू xml फ़ाइल से इसे फुलाए जाने के बाद मैं मेनू आइटम में दृश्यता को बदलना चाहता था। कोड ठीक काम करता प्रतीत होता है, लेकिन कोई दृश्य प्रभाव नहीं है। मैंने onCreateOptionsMenu विधि में मेनू को भरने में समस्या हल की लेकिन onPrepareOptionsMenu विधि में इसकी दृश्यता बदल रही है।

मैं क्या जानना चाहता हूं कि onCreateOptionsMenu में दृश्यता को क्यों बदलना काम नहीं करता है।

onPrepareOptionsMenu में मैं क्या कर सकता हूं कि मैं onCreateOptionsMenu में नहीं कर सकता?

क्या यहां कोई अनुसरण करने के लिए कोई पैटर्न है?

धन्यवाद!

यहाँ प्रासंगिक कोड है, बस मामले में:

public class MyFragment extends Fragment { 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.my_menu, menu); 

     // This does not work, compiles and runs fine, but has no visible effect 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     // This does work 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 
} 
+1

मुझे यकीन है कि नहीं कर रहा हूँ की कोशिश करो, लेकिन [प्रलेखन] (http://developer.android.com/reference/android/app/Activity। एचटीएमएल # onCreateOptionsMenu (android.view.Menu)) कहता है: "_ ... प्रत्येक बार प्रदर्शित होने पर मेनू को अपडेट करने के लिए, [onPrepareOptionsMenu (मेनू)] देखें (http://developer.android.com/reference/android/app/ Activity.html # onPrepareOptionsMenu (android.view.Menu)) ._ " –

+1

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

+0

मैं समझता हूं और सहमत हूं कि एक विकल्प होना चाहिए। हालांकि मेरी राय में, मुझे लगता है कि यह एंड्रॉइड काम करता है। कुछ मामलों में, आप xml विशेषताओं के साथ मेनू के गुणों को हार्डकोड कर सकते हैं। –

उत्तर

5

आपको अपना मेनू बनाने के बाद super.onCreateOptionsMenu(menu, inflater); पर कॉल करना चाहिए, पहले नहीं। यह पदानुक्रम और अन्य टुकड़ों में मेनू भेजता है या गतिविधि स्वयं आइटम जोड़ना चाहती है।

गतिविधि मेनू को प्रदर्शित करने और प्रबंधित करने के लिए ज़िम्मेदार है, इसलिए यदि आप गतिविधि में भेजे जाने के बाद दृश्यता बदलते हैं, तो कुछ भी नहीं होने वाला है।

अब, जब आप super.onPrepareOptionsMenu(menu); पर कॉल करते हैं तो यह मेनू को "तैयार" करेगा, लेकिन अब यह onCreateOptionsMenu में आपके द्वारा किए गए परिवर्तनों को ध्यान में रखेगा।

+1

अच्छा - इस लाइन को हटाएं क्योंकि आप सही हैं "_ मुझे लगता है कि __ – Elltz

+0

हो गया- सुखाने के लिए धन्यवाद। – Christian

0

हो सकता कोड मेनू दृश्यमान बनाने के लिए सच लौटना चाहिए, कि तुम onCreateOptionsMenu() और onPrepareOptionsMenu() दोनों में return true; बयान रखना चाहिए मतलब है।

उम्मीद है कि इससे मदद मिलती है।

+5

ऑनक्रेटऑप्शनमेनू रिटर्न शून्य – Axarydax

+1

असल में, दो ऑनपेयरऑप्शन() विधियां हैं। [पहला] (http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu (android.view.Menu)), गतिविधि वर्ग के लिए, एक मान वापस करता है - यदि सत्य नहीं है लौटा, मेनू नहीं दिखाएगा। [फ्रैगमेंट] (http://developer.android.com/reference/android/app/Fragment.html#onPrepareOptionsMenu (android.view.Menu)) संस्करण नहीं है। फ्रैगमेंट संस्करण को गतिविधि संस्करण के लिए एपीआई 11 बनाम एपीआई 1 की आवश्यकता होती है। दिलचस्प की तरह। – fattire

0

मैं ऑनपेरेपॉप्शनमेनू का उपयोग यह अद्यतन करने के लिए करता हूं कि मेनू पर कौन से आइटम सक्रिय होना चाहिए और गतिविधि की वर्तमान स्थिति के आधार पर कौन से भूरे रंग/हटाए जाने चाहिए। मेनू आइटम की सेट दृश्य विधि का उपयोग यह नियंत्रित करने के लिए करें कि यह वर्तमान में मेनू पर दिखाया गया है या नहीं।

-2

यह काम करता है के लिए मुझे

public class ContentFragment extends android.support.v4.app.Fragment { 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.content_frame,container,false); 
    setHasOptionsMenu(true); 
    return v; 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.note_menu,menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 
} 

यह

+0

यह बात मेरे लिए काम करती है लेकिन डायनामिक चेंज –

+0

के लिए अमान्यateoptionsmenu() विधि का उपयोग करना है, यदि गतिशील मेनू अद्यतन के संबंध में कोई कोड है तो कृपया मुझे बताएं। –

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