2013-05-12 5 views
11

में दो बार बुलाया गया है मेरे पास विकल्प मेनू के साथ एक सरल अनुप्रयोग है, जो टुकड़ों की शुरुआत में बदल रहा है। समस्या यह है कि शुरुआत में किसी भी टुकड़े को क्रिएटऑप्शनमेनू() को छोड़कर दो बार कहा जाता है - ऑनक्रेट() और रीज़्यूम() के बाद। ऑनक्रेट() में मैं इसे setHasOptionsMenu (true) के माध्यम से मैन्युअल रूप से कॉल करता हूं, लेकिन बाद में() पर ऐसा नहीं होना चाहिए। इसके अलावा, यह केवल पहला खंड शुरू होने के बाद होता है।ऑनक्रेटऑप्शनमेनू() को फ्रैगमेंट

class BaseFragment extends Fragment { 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle clicks 
     return true; 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Create a menu 
     super.onCreateOptionsMenu(menu, inflater); 
    } 
} 

और गतिविधि में बदल रहा है टुकड़े कोड:

यहाँ आधार टुकड़े कोड है

public void startFragment(BaseFragment fragment) { 
    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(android.R.id.content, fragment) 
    .commit(); 
} 

नमूना ActionBarSherlock, केवल SupportLibrary की तरह किसी भी बाहरी पुस्तकालय का उपयोग नहीं करता। मुझे लगता है कि समस्या FragmentTransaction() विधि में है, क्योंकि यह पहला टुकड़ा शुरू होने पर ठीक काम करता है। लेकिन मुझे नहीं पता, समस्या को हल करने के लिए कहां शुरू करें। मुझे दृश्य में खंड को बिल्कुल ठीक करने की ज़रूरत है।

+0

आप किस फोन का उपयोग कर रहे हैं? अगर फोन में समर्पित मेनू बटन है, तो क्रिएटऑप्शनमेनू केवल तभी लागू किया जाएगा जब उपयोगकर्ता उस पर क्लिक करेगा। ऐड-ऑन करने के लिए यह अनिवार्य नहीं है कि setHasOptionsMenu (true) को CreateOptionsMenu पर कॉल करना चाहिए। यह सिर्फ ढांचे को सूचित करता है कि मेनू पॉप्युलेट करने पर खंड भाग लेना चाहेगा। – prijupaul

+0

ओपी मुझे एक ही समस्या होने पर प्रश्न जोड़ने/संपादित करने की अनुमति नहीं देता है। मुझे मेनू के बारे में मूलभूत सामान पता है, समस्या ओपी की तरह अजीब है। संपादित करें: मैं नेस्टेड टुकड़े का उपयोग कर रहा हूं – Zyoo

+0

@prijupaul यह वास्तव में केवल पूर्व-हनीकॉम संस्करणों के लिए है। हनीकॉम पर और बाद में क्रिएटऑप्शनमेनू को सेटहासप्शनमेनू() पर कॉल करने के तुरंत बाद बुलाया जाएगा। – bvitaliyg

उत्तर

-1

यदि आप मेनू आइटम को संभाल नहीं पाते हैं, तो आपको ऑनऑप्शन इटैम सेलेक्टेड() (डिफ़ॉल्ट कार्यान्वयन रिटर्न झूठा) के सुपरक्लास कार्यान्वयन को कॉल करना चाहिए।

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 
+0

डाउन-वोट क्यों ??? इसमें क्या गलत है। –

+0

मुझे लगता है कि सवाल यह है कि प्रश्न क्रिएटऑप्शनमेनू के साथ करना है और आपका जवाब उस रेज़्यूमे के साथ करना है जो क्रिएटऑप्शनमेनू और लाइफसाइक्ल पर उचित नहीं है। – prijupaul

+0

नहीं। इसे मैन्युअल रूप से नहीं कहा जाता है। जब सेट हैसऑप्शनमेनू (सत्य) कहा जाता है, तो यह सिर्फ ढांचे को सूचित करता है कि खंड में मेनू है। उपयुक्त होने पर फ्रेमवर्क वांछित फ़ंक्शन को कॉल करता है। यदि यह सत्य पर सेट नहीं है, तो फ्रेमवर्क टुकड़ों में oncreateoptionsmenu का आह्वान नहीं करेगा। – prijupaul

2

मैं नए जोड़े लगता है कि टुकड़ा onCreateOptionsMenu फिर से कहा जा करने के लिए गतिविधियों का कारण बनता है!

1>

setRetainInstance (सही) को जोड़ने का प्रयास करें;

खंड निर्माता के लिए!

public BaseFragment() 
{ 
    setRetainInstance(true); 
    setHasOptionsMenu(true); 
} 

यह/बचत होगी

समस्या रोटेशन पर टुकड़े में से प्रत्येक की अलग-अलग राज्यों बहाल (जब तथ्य यह है कि एंड्रॉयड टुकड़ा जब गतिविधि नष्ट हो जाता है को नष्ट नहीं करता से संबंधित प्रतीत हो रहा है डिवाइस घुमाया गया है)।

मैं इस यहाँ Jake Wharton पाया अतः

अद्यतन: 2> एक और तरीका है लेआउट फ़ाइल पर टुकड़े जोड़ने, और भी उन्हें निर्माता/newInstance विधि को फोन करके मैन्युअल instantiating से बचना है।

यदि आप लेआउट पर एक टुकड़ा जोड़ते हैं, तो एंड्रॉइड फ्रेमवर्क आपके लिए इसे तुरंत चालू कर देगा। मैन्युअल रूप से टुकड़ों को तुरंत चालू करने के बजाय, आपको FragmentManager.getFragmentById को कॉल करके इसका उदाहरण पुनर्प्राप्त करना चाहिए और इसके बजाय उस उदाहरण का उपयोग करना चाहिए।

तो हमेशा menu.clear() कॉल करके अपनी टुकड़े

3> इस के साथ प्रयास करें के लिए एक आईडी और/या एक टैग शामिल

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

    } 
+1

नहीं, मुझे नहीं लगता कि यह जवाब है। बेशक मैंने उपर्युक्त सभी को आजमाया है लेकिन फिर भी यह हर बार होता है जब मैं इसे परीक्षण करता हूं – Zyoo

+0

@Zyoo को आपकी समस्या के लिए कोई अन्य समाधान मिला है? –

+0

क्षमा करें, नहीं, मैंने विकल्पमेनू का उपयोग न करने का निर्णय लिया है, लेकिन मुझे लगता है कि भविष्य में इसकी आवश्यकता होगी, इसलिए मैं अभी भी कोशिश कर रहा हूं – Zyoo

0

आप शायद इस तरह यह कोशिश कर सकते:

private final int MENU_SEARCH=Menu.FIRST; 
: 
    @Override public void onPrepareOptionsMenu(Menu menu) { 
     if (menu.findItem(MENU_SEARCH)==null) { 
      menu.add(0, MENU_SEARCH, Menu.NONE, getText(R.string.menu_search)); 
: 

आईईजांचें कि मेनू में आपके मेनू आइटम में से कोई एक मौजूद है, और यदि नहीं, तो शायद उन सभी को जोड़ने की आवश्यकता है।

7

मैं जानता हूँ कि मैं पार्टी के लिए देर से कर रहा हूँ, लेकिन एक ही मुद्दे में पड़ गए और मेरी समाधान वास्तव में स्पष्ट रूप से मेरी SupportFragments onCreate कार्य करने के लिए

setHasOptionsMenu(false); 

जोड़ने के लिए किया गया था। यह गतिविधियों पर किसी भी अतिरिक्त कॉल को रोकता है 'क्रिएटऑप्शनमेनू और ऑनपेयरऑप्शनमेनू पर। उम्मीद है की यह मदद करेगा।

2

समस्या को हल करने का सबसे आसान तरीका मेनू को फुलाए जाने से ठीक पहले साफ़ करना है।

menu.clear() किसी मौजूदा मेनू को साफ़ कर देगा, और एक ताजा शुरुआत करेगा।

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.sample_menu, menu); 
} 
संबंधित मुद्दे