2012-05-07 21 views
9

मैं एक (है कि मैं एक ViewPager के लिए एडाप्टर के रूप में उपयोग) और कार्रवाई पट्टी से मेनू आइटम FragmentStatePageAdapter साथ समस्या है।FragmentStatePageAdapter डुप्लिकेट ActionBar मेनू आइटम

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

एक महत्वपूर्ण विस्तार है कि केवल डुप्लिकेट किए गए आइटम उन प्रत्येक खंड मैं ViewPager में उपयोग की onCreateOptionsMenu() में बनाए गए हैं।

अगर मैं FragmentPageAdapter साथ replaceFragmentStatePageAdapter आइटम अब और दोहराया गया है नहीं है, लेकिन टुकड़े ViewPager में नहीं दिखाया जाता (GetItem() एडाप्टर से समारोह कभी नहीं कहा जाता है, तो यह किसी भी टुकड़ा वापस नहीं करता है)।

कोई विचार? मेनू आइटम डुप्लिकेट करने के लिए FragmentStatePageAdapter से बचने का एक तरीका? शायद FragmentPageAdapter का उपयोग करें, लेकिन टुकड़े दिखाने के लिए एक संशोधन के साथ? मेरे टुकड़ों में एक संशोधन?

यहाँ मेरी आवेदन से कुछ कोड के टुकड़े कर रहे हैं ...

कैसे मेनू आइटम के टुकड़े के अंदर बनाई गई हैं:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    /* Create play button */ 
    final MenuItem mPlay = menu.add(R.string.play_all); 

    mPlay.setIcon(R.drawable.ic_play_all); 
    mPlay.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    mPlay.setOnMenuItemClickListener(new OnMenuItemClickListener() { 
     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
      final List<Song> songs = getSongs(); 

      if (songs.size() == 0) { 
       /* Show message */ 
       Toast.makeText(mContext, R.string.no_song_list, Toast.LENGTH_LONG).show(); 
      } else { 
       /* Play song list */ 
       try { PlayManager.getService().playList(songs); } catch (Exception e) {} 
      } 

      return false; 
     } 
    }); 

    /* Create menu */ 
    super.onCreateOptionsMenu(menu, inflater); 
} 

कैसे टुकड़े ViewPager एडाप्टर

में instantiated कर रहे हैं
@Override 
public Fragment getItem(int position) { 
    final Class<?> cls = mTabs.get(position); 

    /* No tab */ 
    if (cls == null) 
     return null; 

    /* Instantiate fragment */ 
    final Fragment fragment = Fragment.instantiate(mContext, cls.getName(), null); 

    /* Add to list */ 
    mFragments.put(position, fragment); 

    /* Return fragment */ 
    return fragment; 
} 

धन्यवाद!

पीएस: मैंने लॉन्च मोड को "सिंगलटॉप" में बदलने की कोशिश की और मैंने प्रीइटोसली निर्मित खंड में getItem() में वापस लौटने की कोशिश की (लेकिन यह बेकार है क्योंकि IItem() को एप्लिकेशन पर वापस आने पर कभी नहीं कहा जाता है , जैसा कि मैंने पहले कहा था)।

+0

हैलो, मिगुएल! क्या आपको समाधान मिला? – HighFlyer

+0

हाँ। मैंने अभी इस्तेमाल किए गए समाधान के नीचे पोस्ट किया है। यह एक वास्तविक फिक्स नहीं है बल्कि एक कामकाज है। –

उत्तर

3

मुझे अपनी समस्या पोस्ट करने के कुछ दिनों बाद मेरी समस्या का समाधान मिला। मुझे यहां बहुत देर से डालने के लिए खेद है।

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.remove("android:support:fragments"); 
} 

के रूप में गतिविधि मैं कहाँ का दृष्टांत और टुकड़े का उपयोग में कोड के उस टुकड़े लेखन के रूप में सरल:

निम्नलिखित कोड मेरी समस्या ठीक हो गई।

मैं इस मदद करता है :)

+0

बहुत बढ़िया! :) एक और समाधान: पेजर में टुकड़ों पर setRetainInstance (सत्य) को कॉल करें। – HighFlyer

+0

मुझे इसे भी आजमा देना होगा :) –

+0

कुछ प्रयोगों के बाद ऐसा लगता है कि आउटस्टेट.remove स्क्रीन रोटेशन के साथ काम नहीं करता है, क्योंकि FragmentStatePageAdapter राज्य को पुनर्स्थापित करते समय इस जानकारी का उपयोग करता है। इसके अलावा setRetainInstance (true) पृष्ठभूमि से एप्लिकेशन लॉन्च करने के साथ काम नहीं करता है। – HighFlyer

2

मुझे लगता है समस्या यह है कि FragmentStatePagerAdapter एक नया टुकड़ा हर बार जब आप स्वाइप बनाता है। नतीजतन, क्रिएटऑप्शनमेनू() को बनाए गए प्रत्येक टुकड़े के लिए बुलाया जाता है।

  1. टुकड़े से बाहर कार्रवाई बार हेरफेर लें:

    , मुझे लगता है, दो समाधान कर रहे हैं। टुकड़े के अंदर मेनू आइटम के लिए ऑनक्लिक सेट करने के बजाय, आप गतिविधि से वर्तमान टुकड़े को एक संदेश भेजते हैं।

  2. मेनू.फिंड इटिम() का उपयोग यह देखने के लिए करें कि क्या एक और टुकड़ा पहले से ही मेनूइटम जोड़ रहा है, और यदि ऐसा है तो वर्तमान फ्रैगमेंट को संलग्न करें (ऑनपेरेपॉप्शनमेनू() में।

+0

यही कारण नहीं है। पहली बार जब मैं ऐप लॉन्च करता हूं, और जब मैं स्वाइप करता हूं, तो यह सही काम करता है। जब मैं स्वाइप करता हूं, तो जिस टुकड़े से मैं स्थानांतरित होता हूं, उसे हटा दिया जाता है, और जिस टुकड़े को मैं स्थानांतरित करता हूं, उसे जोड़ दिया जाता है। समस्या तब होती है जब पृष्ठभूमि पर होने पर गतिविधि बंद होती है और मैं इसे फिर से शुरू करता हूं। –

3

ViewPager के अंदर अपने टुकड़ा में विकल्प मेनू बढ़ा-चढ़ाकर इससे पहले कि उम्मीद है, यह देखना होगा कि टुकड़ा उदाहरण डुप्लिकेट किए गए मेनू आइटम को रोकने के लिए दिख रहा है:

// This should be in your Fragment implementation 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
{ 
    if(isVisible()) 
    { 
     inflater.inflate(R.menu.menu_fragment, menu); 
    } 
    super.onCreateOptionsMenu(menu, inflater); 
} 
+0

आपका कोड डुप्लिकेशन समस्या को दूर करने में मेरी सहायता करता है लेकिन यह खंड को नहीं बदलता है। – Roon13

0

मैं कुछ समाधान नहीं मिला कोशिश यह काम हो सकता है

अपना डुप्लिकेट मेनू टुकड़ा में onCreateOptionsMenu(Menu menu, MenuInflater inflater)

में से पहले बढ़ मेनू फ़ाइल menu.clear() जोड़े 0
@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.main,menu); 
    } 
संबंधित मुद्दे