का उपयोग करके एक्शनबार में कई बार बुलाया जा रहा है। यह मेरी समस्या है। मेरे पास एक ऐप है जहां मैं टैब के साथ एक्शनबार शेरलॉक का उपयोग कर रहा हूं, विकल्प मेनू के साथ टुकड़े। हर बार जब मैं एमुलेटर घुमाता हूं, तो मेन्यू को सभी टुकड़ों के लिए जोड़ा जाता है, जो कि छिपे/हटाए जाते हैं (मैंने दोनों की कोशिश की)। एक FragmentActivity,ऑनक्रेटऑप्शनमेनू को टैब
final ActionBar bar = getSupportActionBar();
bar.addTab(bar.newTab()
.setText("1")
.setTabListener(new MyTabListener(new FragmentList1())));
bar.addTab(bar.newTab()
.setText("2")
.setTabListener(new MyTabListener(new FragmentList2())));
bar.addTab(bar.newTab()
.setText("3")
.setTabListener(new MyTabListener(new FragmentList3())));
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayShowHomeEnabled(true);
bar.setDisplayShowTitleEnabled(true);
के साथ एक ActionBar टैब सभी एक ही श्रोता का उपयोग किया है कि:
यह सेटिंग है
private class MyTabListener implements ActionBar.TabListener {
private final FragmentListBase m_fragment;
public MyTabListener(FragmentListBase fragment) {
m_fragment = fragment;
}
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
FragmentManager fragmentMgr = ActivityList.this.getSupportFragmentManager();
FragmentTransaction transaction = fragmentMgr.beginTransaction();
transaction.add(R.id.frmlyt_list, m_fragment, m_fragment.LIST_TAG);
transaction.commit();
}
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
FragmentManager fragmentMgr = ActivityList.this.getSupportFragmentManager();
FragmentTransaction transaction = fragmentMgr.beginTransaction();
transaction.remove(m_fragment);
transaction.commit();
}
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
}
FragmentListBase से प्रत्येक उपवर्ग अपने स्वयं के मेनू और इसलिए सभी है 3 उप-वर्गों में:
setHasOptionsMenu(true);
और उपयुक्त
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.d(TAG, "OnCreateOptionsMenu");
inflater.inflate(R.menu.il_options_menu, menu);
}
जब मैं अनुप्रयोग मैं देख सकता हूँ कि onCreateOptionsMenu कई बार बुलाया जा रहा है, सभी अलग अलग टुकड़े के लिए चलाते हैं।
मैं पूरी तरह से स्टंप हूं।
मैंने भारी कोड के बिना जितना संभव हो उतना कोड पोस्ट करने का प्रयास किया, अगर आपको लगता है कि कुछ गुम है, तो कृपया सलाह दें।
[संपादित करें] मैंने और अधिक लॉगिंग जोड़ा, और यह पता चला कि रोटेशन पर टुकड़ा दो बार (या अधिक) लगाया जा रहा है। एक बात जो मैंने नोटिस की है कि ऑनक्रेट() विधि को छोड़कर सबकुछ कई बार कहा जा रहा है जिसे केवल एक बार कहा जा रहा है।
06.704:/WindowManager(72): Setting rotation to 0, animFlags=0
06.926:/ActivityManager(72): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=1/1/2 nav=1/2 orien=L layout=0x10000014 uiMode=0x11 seq=35}
07.374:/FragmentList1(6880): onAttach
07.524:/FragmentList1(6880): onCreateView
07.564:/FragmentList1(6880): onAttach
07.564:/FragmentListBase(6880): onCreate
07.564:/FragmentList1(6880): OnCreateOptionsMenu
07.574:/FragmentList1(6880): OnCreateOptionsMenu
07.604:/FragmentList1(6880): onCreateView
[संपादित करें 2]
ठीक है, मैं Android कोड में वापस अनुरेखण शुरू कर दिया और यहाँ इस हिस्से में पाया गया (कि मैं इस पोस्ट को छोटा करने के संपादित)।
/com_actionbarsherlock/src/android/support/v4/app/FragmentManager.java
public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (mActive != null) {
for (int i=0; i<mAdded.size(); i++) {
Fragment f = mAdded.get(i);
if (f != null && !f.mHidden && f.mHasMenu) {
f.onCreateOptionsMenu(menu, inflater);
}
}
}
समस्या यह है कि mAdded वास्तव में, उस में FragmentList1 के कई उदाहरण है इसलिए onCreateOptionsMenu() विधि "है सही ढंग से "3 बार कहा जा रहा है, लेकिन FragmentList1 वर्ग के विभिन्न उदाहरणों के लिए। जो मुझे समझ में नहीं आता है वह है कि उस वर्ग को कई बार क्यों जोड़ा जा रहा है ... लेकिन यह एक अच्छा नेतृत्व का नरक है।
यह उत्तर अत्यधिक जटिल है। * एक्शनबार * टैब में टैब जोड़ने से पहले बस मेरी समस्या को ठीक करने के लिए कॉल को 'bar.setNavigationMode (ActionBar.NAVIGATION_MODE_TABS)' पर ले जाया गया। – Phil