2012-08-23 24 views
37

नहीं दिखा रहा है मुझे अपने अंतिम प्रश्नों के लिए बहुत उपयोगी संकेत मिले हैं, मुझे आशा है कि यह इस बार अलग नहीं होगा :) सबसे पहले, मुझे स्थिति की व्याख्या करने दें। मेरे पास 2 टुकड़ों के साथ एक गतिविधि है। प्रत्येक खंड के लिए मेरे पास एक एक्सएमएल मेनू लेआउट है, पहले में चार मेनू प्रविष्टियां हैं, दूसरे में केवल एक ही है। अब पहले चार मेनू प्रविष्टियों के साथ टुकड़ा लोड किया गया है। अपने onCreate विधि में मैं सेटटुकड़े टुकड़े में मेनू

this.setHasOptionsMenu(true); 

onCreateOptionsMenu विधि

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

xml फ़ाइल इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/menu_refresh" 
     android:icon="@drawable/ic_action_search" 
     android:title="Refresh" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" /> 
<item android:id="@+id/menu_clearall" 
     android:icon="@drawable/ic_action_search" 
     android:title="Clear" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" /> 
<item android:id="@+id/menu_addcontent" 
     android:icon="@drawable/ic_action_search" 
     android:title="Add Content" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" /> 
<item android:id="@+id/menu_newlist" 
     android:icon="@drawable/ic_action_search" 
     android:title="New List" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" />  
</menu> 

यह ठीक काम करता है। सभी मेनू आइटम वहां हैं, मैं उन्हें क्लिक कर सकता हूं और जवाब दे सकता हूं। अब जब मैं "सामग्री जोड़ें" मेनू पर क्लिक करता हूं, तो दूसरा खंड लोड होता है। वहाँ मैं भी

this.setHasOptionsMenu(true); 

सेट onCreateOptionsMenu विधि

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { 
    Log.i("FragCreateList","onCreateOptionsMenu called"); 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.menu_fragcreatelist, menu); 
} 

xml फ़ाइल

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/menu_editdone" 
     android:icon="@drawable/ic_action_search" 
     android:title="Edit Done" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" />   
</menu> 

लेकिन नए टुकड़ा में मैं किसी भी मेनू आइटम नहीं देख सकता। न तो एक्शन बार में, न ही जब मैं हार्डवेयर मेनू बटन दबाता हूं। पूर्व खंड में, दो मेनू आइटम एक्शनबार में थे, शेष दो तब दिखाई दिए जब हार्डवेयर बटन दबाया गया था। लेकिन यहां कुछ भी नहीं दिखाया गया है। मुझे लॉगकैट संदेश मिलता है कि ऑनक्रेटऑप्शनमेनू विधि को बुलाया गया है, लेकिन कुछ भी नहीं होता है। (मुझे अपने (खाली) पर एक कॉल भी मिलती है PrepareOptionsMenu विधि, जिसे मेनू दिखाए जाने से ठीक पहले कहा जाना चाहिए, अभी भी कुछ नहीं) कोई सुराग क्या गलत हो सकता है? अवैध अमान्य कॉलिंगमेनू कुछ नहीं करता है। इसके अलावा, मुझे यह सुनिश्चित करने के लिए पता नहीं है कि किसको कॉल करना है, क्योंकि कोई एक्टिविटी() है। अमान्य ऑप्शनमेनू और एक getFragmentManager()। अवैध ऑप्शनमेनू ... अग्रिम धन्यवाद।

संपादित करें:

<uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="15" /> 
+0

उत्तर से उत्तर देते हैं, ऐसा लगता है कि यह कई चीजों के कारण हो सकता है। क्योंकि मैं एक FragmentActivity उपयोग कर रहा था एक AppCompatActivity के बजाय मैं इस मुद्दे था, और यह रूप में जल्द ही के रूप में मैं बदल गया है कि – TallChuck

उत्तर

0

कोशिश टुकड़े में onPrepareOptionsMenu को onCreateOptionsMenu बदलने के लिए, मैं एक ही समस्या थी और जहाँ तक मुझे याद यह मेरे लिए इसे हल ...

+0

\t @Override \t सार्वजनिक शून्य onPrepareOptionsMenu (मेनू मेनू) { \t \t Log.i ("FragCreateList करने के लिए इसे बदल दिया है काम "," onPrepareOptionsMenu कहा जाता है "); \t \t मेनू इन्फ्लूटर inflater = नया menuInflater (getActivity()); \t \t inflater.inflate (R.menu.menu_fragcreatelist, मेनू); \t \t \t} लेकिन अभी भी कुछ नहीं ... कुछ भी नहीं दिख रहा है। –

+0

अजीब, मेरे पास दो टुकड़े, क्लासिक स्कीमा के साथ गतिविधि है, गतिविधि में स्वयं एक मेनू है और प्रत्येक टुकड़े का अपना मेनू होता है। मेरे पास गतिविधि में क्रिएटऑप्शनमेनू और टुकड़ों में पेपरारेप्शनमेनू पर है। और मेरे पास सभी तीन मेनू संयुक्त दिखाए गए हैं ... – Dimanoid

+0

शायद हम गलत समझा, मैं नहीं चाहता कि मेरे सभी मेनू संयुक्त हो जाएं, मैं चाहता हूं कि दो अलग-अलग खंड दो अलग-अलग टुकड़ों में दिखाए जाएं, लेकिन केवल एक टुकड़ा मेनू दिखाता है। मैंने पहली बार अपनी गतिविधि में क्रिएटऑप्शन भी किया था, लेकिन सभी को टुकड़ों में ले जाया गया, जैसा कि मैंने सोचा था कि यह अधिक समझ में आता है।मैंने अपनी समस्या को एक अलग डिजाइन दृष्टिकोण के साथ हल किया है, फिर भी मैं जानना चाहता हूं कि यह क्यों काम नहीं करता :) प्रयास के लिए धन्यवाद। –

2

जब विकल्पों के लिए पंजीकरण/टुकड़ों में संदर्भ मेनू, आपको आम तौर पर ऑटिविटीक्रेटेड() कॉल तक प्रतीक्षा करने की आवश्यकता होती है ताकि यह सुनिश्चित किया जा सके कि मेनू को बांधने की कोई गतिविधि है। ठीक यहाँ सुझाव करें और देखें कि यह मदद करता है: मेनू बढ़ा-चढ़ाकर से पहले

Context menu from a ListFragment

+0

हे जेस्मिथ, यह प्रासंगिक मेनू के बारे में है, मैं क्रमशः एक्शनबार मेनू आइटम या हार्डवेयर बटन मेनू आइटम के बारे में बात कर रहा हूं। –

+2

हाँ, मैं समझ गया। इस मुद्दे को पढ़ने में, यह प्रतीत होता था कि आप क्रेट पर टुकड़ों में setHasOptionsMenu (true) को कॉल करते हैं। मैं सुझाव दे रहा हूं कि आप इसे दोनों टुकड़ों के लिए एक्टिविटीक्रेटेड() विधि पर ले जाएं। यह विकल्प मेनू और संदर्भ मेनू पर लागू होता है। – jsmith

50

उपयोग menu.clear()।

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    menu.clear(); 
    inflater.inflate(R.menu.mnulayout, menu); 
} 
+0

धन्यवाद, मेरी मदद की। –

+0

मेरे लिए भी काम किया –

+3

+1 नोट करें कि सुपर कॉल स्पष्ट और फुलाए तरीकों से ऊपर होना चाहिए। अन्यथा यह ओवरफ्लो मोड में दिख रहा है। – Praveen

8

मुझे एक ही समस्या थी। मैं आइटम MyApp संदर्भ के लिए लागू में showAsAction का उपयोग करके इसे ठीक किया गया:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:myapp="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/action_refresh" 
      android:icon="@drawable/ic_refresh" 
      android:title="refresh" 
      android:visible="true" 
      myapp:showAsAction="ifRoom|withText"/> 
</menu> 

क्षमा करें यह आप के लिए बहुत देर हो चुकी है, लेकिन यह अन्य लोगों के लिए उपयोगी हो सकता है।

+3

नोट: 'एंड्रॉइड का उपयोग करना: शोएएसएक्शन' का समर्थन फ्रेगमेंट का उपयोग करते समय कोई प्रभाव नहीं पड़ता है, इसलिए res-auto के साथ दूसरा नेमस्पेस सेट करना महत्वपूर्ण है। सहायता के लिए धन्यवाद। इस पोस्ट के लिए –

+0

+1 @aglour, सबकुछ सेटअप था और एरिक द्वारा उल्लिखित समर्थन वी 4 का उपयोग कर रहा था, यह नहीं देख सकता कि यह अन्यथा कैसे तय करेगा, धन्यवाद। – WickedW

72

मैं onCreateView में setHasOptionsMenu (सही) जोड़ा गया है और यह ठीक

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    setHasOptionsMenu(true); 
    return inflater.inflate(R.layout.my_example_fragment, container, false); 

} 
+3

मेरे लिए काम किया ... धन्यवाद –

+0

हाँ, यह काम कर रहा है। – venkat

5

यह इसलिए होता है क्योंकि आपके डिवाइस हार्डवेयर मेनू बटन काम करता है। इसलिए परिवर्तनीय "sHasPermanentMenuKey" का मान ViewConfiguration hasPermanentMenuKey() में सत्य है। प्रतिबिंब का उपयोग करके आपको इस चर के झूठे मूल्य को रखना होगा। उदाहरण:

// this method force showing menu button in device with hardware menu button 
private void showOverflowMenu(FragmentActivity activity) { 
    try { 
     ViewConfiguration config = ViewConfiguration.get(activity); 
     Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); 
     if (menuKeyField != null) { 
      menuKeyField.setAccessible(true); 
      menuKeyField.setBoolean(config, false); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

नोट: टुकड़ा की विधि OnCreate() में नहीं इस() गतिविधि के onCreate में विधि का उपयोग करें।

-1

एक बहुत देर हो चुकी है क्योंकि ऊपर दिए गए सुझावों में से कोई भी मेरी समस्या हल नहीं करता है।

@Override 
public void onPrepareOptionsMenu(Menu menu) 
{ 
    if (Build.VERSION.SDK_INT < 11) { 
     menu.clear(); 
     getActivity().getMenuInflater().inflate(R.menu.message_thread, menu); 
    } 
0

आपकी गतिविधि की जरूरत: मेरा डिवाइस (2.3.5) है कि मैं एक अलग रास्ता जाने के लिए और गतिविधि से inflater का उपयोग कर onprepare भाग में मेनू बनाने के लिए किया था विकल्प मेनू के साथ इस तरह के एक बुरा समय समस्या थी एक्शनबैरएक्टिविटी का विस्तार करने के लिए। आपके पास ऐसा हो सकता है जो केवल गतिविधि को बढ़ाता हो। मजबूत पाठ

4

यह वास्तव में मेरे लिए काम करता है और आपका समाधान भी हो सकता है।

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    setHasOptionsMenu(true); 
} 
0

एक टुकड़ा वर्ग के लिए आदेश आप अपने मेनू भी विधि onCreateView() या onCreateAcivity() विधि में sethasoptionsmenu (सही) जोड़ने को देखने के लिए में। लेकिन मैंने अपनी CreateView() विधि पर जोड़ा। आशा है कि यह मदद करता है किसी को

2

अपने सभी टुकड़ा के पहले onCreate

setHasOptionsMenu(true); 

में होना आवश्यक है और फिर आप की जाँच करने के अपनी गतिविधि न कि विषय इसकी मुश्किल की, लेकिन अगर एक छोटे से की तरह NoActionBar है है आपके गतिविधि में यह विषय कोई फर्क नहीं पड़ता कि आप setHasOptionsMenu(true) कहां कॉल करते हैं, आप टुकड़े उसे

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