2012-05-17 17 views
13

मैं एक ऐप विकसित कर रहा हूं जिसमें मूल रूप से एक्शनबार है। जब मेरा ऐप शुरू होता है, तो गतिविधि टुकड़े बनाती है और उन्हें प्रत्येक टैब पर जोड़ती है, इसलिए जब मैं स्विच करता हूं तो मुझे अलग-अलग विचार मिलते हैं।एंड्रॉइड फ्रैगमेंट्स ने ओरिएंटेशन चेंज पर पुनर्निर्मित किया

जब मैं डिवाइस को घुमाने की कोशिश करता हूं तो समस्या उत्पन्न होती है। कुछ संघर्ष के बाद, मैंने देखा है कि एंड्रॉयड स्वचालित रूप से पूर्व में जोड़े टुकड़े इस तरह का पुनर्निर्माण:

SummaryFragment.onCreate(Bundle) line: 79 
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795 
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032 
FragmentManagerImpl.moveToState(int, boolean) line: 1014  
FragmentManagerImpl.dispatchCreate() line: 1761 
DashboardActivity(Activity).onCreate(Bundle) line: 864 
... 

और उसके बाद मैं हमेशा की तरह टुकड़े से तैयार करें। तो मेरे पास "असली" टुकड़े हैं जिन्हें मैं सही ढंग से काम करने की उम्मीद करता हूं और उनके "छिपा" एंड्रॉइड द्वारा बनाए गए समकक्ष जो मेरे ऐप को क्रैश करते हैं। मैं इस व्यवहार से कैसे बच सकता हूं? मैंने पहले ही सारांश फ्रेगमेंट में setRetainInstance (false) को कॉल करने का प्रयास किया है।

आप

उत्तर

35

आप के लिए एक savedInstanceState जांच करने की आवश्यकता है, और अगर यह मौजूद है, अपने टुकड़े का निर्माण नहीं करतीं।

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    if (savedInstanceState == null) { 
     // Do your oncreate stuff because there is no bundle 
    } 
// Do stuff that needs to be done even if there is a saved instance, or do nothing 
} 
+1

यह सुनिश्चित नहीं है कि यह एक ही समस्या है ओपी था, लेकिन यह मेरे लिए अविश्वसनीय रूप से उपयोगी था। धन्यवाद। – ssmy

+0

धन्यवाद बहुत धन्यवाद @ बराक केवल एक सप्ताह के बाद समाधान –

0

धन्यवाद आप दोनों झुकाव आप अपने मैनिफ़ेस्ट फ़ाइल में गतिविधि के android:configChanges="keyboardHidden|orientation" सेट कर सकते हैं के लिए इसी तरह की ui (कोई विशिष्ट लेआउट भूमि फ़ाइलें) है।

यदि स्रोत प्रदान नहीं करते हैं तो आप स्रोत कोड जहां आप टैब में टुकड़े जोड़ रहे हैं, और मैं सुधार के साथ आपकी सहायता करने की कोशिश करूंगा।

+0

आंशिक रूप से आपके उत्तर के साथ हल हो गया। चूंकि अधिकांश चित्र गतिशील रूप से किए जाते हैं, इसलिए मैं सभी विचारों को हटा देता हूं और उन्हें नए अभिविन्यास के अनुसार रिलाउट करता हूं। ईमानदारी से, मुझे नहीं लगता कि यह एक साफ समाधान है, लेकिन मैं सिस्टम को जंगली रूप से मेरे लिए टुकड़े बनाने में रोकने में असमर्थ हूं ... – Luke47

+0

इससे मुझे मदद मिली क्योंकि मैं अपने लेआउट-भूमि फ़ाइलों को बदलने के बाद भूलना भूल रहा हूं छायाचित्र। यह मुझे लगभग 5 गुना मिल गया है। – buster

+3

डिवाइस को कार डॉक में या किसी टीवी या किसी अन्य कॉन्फ़िगरेशन में प्लग करने पर गंदा चीजें होती हैं: टुकड़े अभी भी पुनर्निर्मित किए जाएंगे। एंड्रॉइड: configChanges बुराई है, जब तक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं। – personne3000

0

जब आप अपनी गतिविधि बनाते हैं, तो यह सुनिश्चित करने के लिए जांचें कि यह पहले से मौजूद नहीं है। यदि यह मौजूद है, तो कुछ भी नहीं करें ... एंड्रॉइड आपके लिए इसे फिर से बनाएगा। [संपादित करें: अपने माता पिता गतिविधि में]

private void initFragment() { 
     FragmentManager fragMgr = getSupportFragmentManager(); 
     if (fragMgr.findFragmentByTag(LEADERBOARD_FRAG_TAG) != null) { return; } 
     frag = new HdrLeaderboardFragment(); 
     FragmentTransaction ft = fragMgr.beginTransaction(); 
     ft.replace(R.id.leaderboard_fragment_wrapper, frag, LEADERBOARD_FRAG_TAG); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.commit(); 
    } 
+1

ऐसा करने से यह अभी भी दो टुकड़े जोड़ता है ... जो मेरे पास पहले से था (जिस तरह से आपने सुझाव दिया था) और दूसरा जो सचमुच मुझे पागल कर रहा है। अनुकूलन परिवर्तनों के बीच FragmentManager को रीसेट करना इतना आसान होता ... – Luke47

0

मुझे यकीन नहीं है कि कोई बेहतर समाधान है, लेकिन यह मैंने नवीनतम कार्यक्रम में किया है।

जब अभिविन्यास परिवर्तन पर सिस्टम द्वारा स्वचालित रूप से एक टुकड़ा बनाया जाता है और यदि आप मेजबान गतिविधि में उनका ट्रैक रखना चाहते हैं, तो उन्हें होस्ट गतिविधि की OnAttachFragment() विधि में पकड़ें। और वे डिफ़ॉल्ट रूप से तर्क प्राप्त करते हैं, ताकि आप यह पता लगाने के लिए उनका उपयोग कर सकें कि यह कौन सा टुकड़ा है।

public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 
    if (fragment != null) { 
     if(fragment.getArguments() != null) { 
      switch (fragment.getArguments().getString(ARG_PARAM1)) { 
       case FragmentATag: 
        if (myFragmentA != fragment) { 
         myFragmentA = (FragmentA) fragment; 
        }      
        break; 
       case FragmentBTag: 
        if (myFragmentB != fragment) { 
         myFragmentB = (FragmentB) fragment; 
        }       
        break;     
      } 
     } 
    } 
    }