2013-08-14 10 views
6

के आधार पर एक्शनबार मेनू स्थिति बदलना मैं किस खंड को दिखाई दे रहा हूं, इस पर निर्भर करता हूं कि मैं अपने एक्शन बार में आइटम दिखाने/छिपाने की कोशिश कर रहा हूं।खंड

मेरी MainActivity में मैं निम्नलिखित है

/* Called whenever invalidateOptionsMenu() is called */ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    if(this.myFragment.isVisible()){ 
     menu.findItem(R.id.action_read).setVisible(true); 
    }else{ 
     menu.findItem(R.id.action_read).setVisible(false); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

यह महान तथापि, जब डिवाइस वहाँ घुमाया जाता है काम करता है एक मुद्दा है। घूर्णन पूरा होने के बाद PrepareOptionsMenu को फिर से बुलाया जाता है हालांकि इस बार यह.myFragment.isVisible() झूठी देता है ... और इसलिए जब मेनू स्पष्ट रूप से खंड दिखाई देता है (जहां तक ​​स्क्रीन पर दिखाया गया है) मेनू आइटम छुपा हुआ है।

+0

सुनिश्चित नहीं हैं, लेकिन आप दोनों पोर्ट्रेट और लैंडस्केप मोड के लिए एक ही टुकड़ा का उपयोग कर रहे हैं या आप लैंडस्केप मोड में रूप में अच्छी तरह से कुछ अन्य टुकड़े जोड़ सकता हूँ? घूर्णन पर जब यह स्वयं को फिर से शुरू करता है, तो आप सुनिश्चित हैं कि यह फ्रैगमेंट एक्टिविटी से जुड़ा हुआ है। आप fragment.isAdded() का उपयोग करके इसे देख सकते हैं? –

+0

हां, क्रिएट विधि पर गतिविधि में मैं करता हूं: this.myFragment = new MyListFragment(); और फिर यह। myFragment गतिविधि –

उत्तर

-3

संपादित करें: यह एक त्वरित और गंदा फिक्स है, बेहतर समाधान के लिए नीचे es0329's answer देखें।

अपने Android मेनिफेस्ट में अपने activity टैग से इस विशेषता को जोड़ने का प्रयास करें:

android:configChanges="orientation|screenSize" 
+0

के माध्यम से संदर्भित है धन्यवाद, सही –

+2

मुझे आश्चर्य है कि एंड्रॉइड डेवलपर्स कभी भी इस सम्मेलन को छोड़ने में सक्षम होंगे। यहां पोस्ट किया गया दूसरा समाधान बहुत बेहतर है। –

+0

पहली बार मैंने नीचे वोटों के साथ उत्तर स्वीकार कर लिया है। जबरदस्त हंसी!!! –

0

उपयोग करने का प्रयास टुकड़ा के setRetainInstance(true); जब अपने टुकड़ा गतिविधि से जुड़ा हुआ है। इस तरह आपका टुकड़ा इसके वर्तमान मूल्यों को बनाए रखेगा और डिवाइस घुमाए जाने पर जीवन चक्र को कॉल करेगा। आप सामान्य रूप से मानक मेनू के लिए होगा के रूप में एक res/menu/fooFragmentMenu.xml कि मेनू आइटम शामिल हैं बनाएँ:

24

Fragments API Guide के आधार पर हम आइटम के लिए कार्रवाई करने के लिए बार एक प्रति टुकड़ा आधार पर निम्न चरणों के साथ जोड़ सकते हैं।

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:id="@+id/newAction" 
     android:orderInCategory="1" 
     android:showAsAction="always" 
     android:title="@string/newActionTitle" 
     android:icon="@drawable/newActionIcon"/> 
</menu> 

FooFragment के onCreate विधि के शीर्ष की ओर से संकेत मिलता है इसे जोड़ने के लिए अपने स्वयं के मेनू आइटम है।

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
    ... 
} 

अवहेलना onCreateOptionsMenu है, जहां आप टुकड़ा के मेनू बढ़ और अपने मानक मेनू में अटैच कर देंगे।

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

अवहेलना अपने टुकड़ा है, जो केवल जब मेजबान गतिविधि/FragmentActivity के इस एक ही विधि देखता है कि यह चयन के लिए एक मामला नहीं है कहा जाता हो जाता है में onOptionItemSelected।

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.newAction: 
      ... 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

शानदार। धन्यवाद। –

+0

फिर हम बैक/अप बटन नेविगेशन कैसे प्रदान कर सकते हैं? –

+0

हो सकता है कि आप Google एंड्रॉइड टीम के सदस्य हों। बहुत अच्छा ! –