12

का उपयोग करते समय टुकड़ों का डुप्लिकेट करना मेरे पास टुकड़ों के साथ एक बहुत ही अजीब समस्या है। मैं नवीनतम समर्थन पुस्तकालय का उपयोग करता हूं। मैं Google द्वारा उनके IOSCHED projectएंड्रॉइड: समर्थन फ्रैगमेंट प्रबंधक

में उपयोग किए गए समान कोड का भी उपयोग करता हूं लेकिन मुझे घूर्णन के बाद गतिविधि को पुनर्जीवित करने में समस्या है। एक गतिविधि को नष्ट करने और फिर से बनाया जाने के बाद, मैं खंड लेनदेन (ऑनस्टार्ट विधि में) के प्रबंधन के तरीकों को कॉल करता हूं। इस रेखा को केवल एक बार बुलाया जाता है, लेकिन यह टुकड़ा दो बार बनाता है!

यह मेरा गतिविधि विधि है:

public abstract class SinglePaneActivity extends FragmentActivity 
{ 
    @Override 
    protected void onStart() 
    { 
     super.onStart(); 

     if(mFragment == null) 
     { 
      mFragment = onCreatePane();  
      mFragment.setArguments(Utils.intentToFragmentArguments(getIntent())); 

      Log.w(TAG, "Fragment creation counter = " + createCounter); 
      createCounter++; 

      getSupportFragmentManager() 
      .beginTransaction() 
      .add(R.id.root_container,mFragment) 
      .commit(); 
     } 
    } 

    @Override 
    protected void onStop() 
    { 
     Log.i(TAG, "onStop"); 
     if(mFragment != null) 
     { 
      getSupportFragmentManager() 
      .beginTransaction() 
      .remove(mFragment) 
      .commit(); 

      mFragment = null; 
     } 
     super.onStop(); 
    } 
} 

और मेरे लॉग्स:

--Start of application-- 
11-18 13:26:37.050: I/SinglePaneActivity(19040): onCreate 
11-18 13:26:37.050: I/SinglePaneActivity(19040): onStart 
11-18 13:26:37.055: W/SinglePaneActivity(19040): replacing fragment, counter = 1 
11-18 13:26:37.075: I/MyFragment(19040): onCreate 
11-18 13:26:37.110: I/MyFragment(19040): onActivityCreated 
--Rotating the device-- 
11-18 13:26:39.600: I/SinglePaneActivity(19040): onStop 
11-18 13:26:39.600: I/SinglePaneActivity(19040): onDestroy 
11-18 13:26:39.605: I/MyFragment(19040): onDestroy 
11-18 13:26:39.755: I/MyFragment(19040): onCreate 
11-18 13:26:39.755: I/SinglePaneActivity(19040): onCreate 
11-18 13:26:39.790: I/MyFragment(19040): onActivityCreated 
11-18 13:26:39.800: I/SinglePaneActivity(19040): onStart 
11-18 13:26:39.800: W/SinglePaneActivity(19040): replacing fragment, counter = 2 
11-18 13:26:39.810: I/MyFragment(19040): onCreate 
11-18 13:26:39.815: I/MyFragment(19040): onActivityCreated 
--Rotating the device back-- 
11-18 13:36:47.060: I/SinglePaneActivity(19040): onStop 
11-18 13:36:47.060: I/SinglePaneActivity(19040): onDestroy 
11-18 13:36:47.060: I/MyFragment(19040): onDestroy 
11-18 13:36:47.065: I/MyFragment(19040): onDestroy 
11-18 13:36:47.130: I/MyFragment(19040): onCreate 
11-18 13:36:47.130: I/MyFragment(19040): onCreate 
11-18 13:36:47.130: I/SinglePaneActivity(19040): onCreate 
11-18 13:36:47.140: I/MyFragment(19040): onActivityCreated 
11-18 13:36:47.150: I/MyFragment(19040): onActivityCreated 
11-18 13:36:47.150: I/SinglePaneActivity(19040): onStart 
11-18 13:36:47.150: W/SinglePaneActivity(19040): replacing fragment, counter = 3 
11-18 13:36:47.160: I/MyFragment(19040): onCreate 
11-18 13:36:47.160: I/MyFragment(19040): onActivityCreated 
--Exiting the app-- 
11-18 13:36:48.880: I/SinglePaneActivity(19040): onStop 
11-18 13:36:48.885: I/SinglePaneActivity(19040): onDestroy 
11-18 13:36:48.885: I/MyFragment(19040): onDestroy 
11-18 13:36:48.890: I/MyFragment(19040): onDestroy 
11-18 13:36:48.890: I/MyFragment(19040): onDestroy 

तो टुकड़े की संख्या प्रत्येक रोटेशन के बाद बढ़ रहा है।

घूर्णन के बाद यह मेरे ऑनस्टार्ट विधि पर जाने से पहले खंड को पुनर्स्थापित करता है और मेरी ऑनस्टार्ट विधि उसी फ्रेम लेआउट कंटेनर में दूसरा समान खंड बनाता है। लेकिन जहां यह पहला खंड बहाल करता है? मैं इसे लूटना चाहता हूं। या क्या मुझे अपना "अगर" परीक्षण करना चाहिए यदि यह पहले से ही बनाया गया है? लेकिन मुझे नहीं पता कि इसे कैसे निर्धारित किया जाए। ऐसा लगता है कि शून्य परीक्षण बेकार है।

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

कृपया मेरी मदद करें ... मुझे वास्तव में पता नहीं है कि इसके साथ क्या किया जाए। किसी भी सलाह या विचार के लिए बहुत बहुत धन्यवाद!

उत्तर

23

अच्छी तरह से मुझे एक समाधान मिला। मुझे कोड को चालू करने के लिए ऑनस्टार्ट से कोड को स्थानांतरित करना था और savedInstanceState का मान जांचना था। खैर मुझे नहीं पता था कि यह स्वचालित रूप से savedInstanceState से सहेजा और बहाल किया गया है। जानकार अच्छा लगा!

संपादित करें: और यह पूरी तरह से सही, यानी टुकड़ा बहाल जब savedInstanceState रिक्त नहीं है ऐसा करने के लिए, वहाँ होना चाहिए: setRetainInstance(true);

+0

हाँ! धन्यवाद। मैं एक ही मुद्दे से जूझ रहा था। मेरे खंड को लोड करने से पहले मेरी गतिविधि में एक शून्य सहेजे गए इंस्टेंसस्टेट की जांच की गई चाल – Chiatar

-1

या अपने टुकड़ा वापस ढेर में नहीं है, तो मुझे एक ही समस्या थी, लेकिन मैं एक पैरेंट टुकड़े से एक बच्चा टुकड़ा जोड़ रहा था और एक डुप्लिकेट बाल टुकड़ा देख रहा था। मैं इसे मूल खंड के onStart में जोड़ने की कोशिश कर रहा था, इसलिए मैं मूल दृश्य तक पहुंच सकता था, जो onCreate में उपलब्ध नहीं है। तो कोड को onCreate पर ले जाने के बजाय, मैंने इसे onActivityCreated पर ले जाया; उस विधि के अभिभावक दृश्य तक पहुंच है और यह भी जांचने के लिए savedInstanceState चर तक पहुंच है कि यह खंड जांचने के लिए पहले से ही स्वचालित रूप से जोड़ा जा रहा है या नहीं। गतिविधि से एक टुकड़ा जोड़ते समय यह कोई समस्या नहीं है क्योंकि गतिविधि का दृश्य onCreate में उपलब्ध है।


किसी कारण से आप onStart या किसी अन्य जगह है जहाँ savedInstanceState उपलब्ध नहीं है में एक टुकड़ा जोड़ने की जरूरत है, तो यहां एक विकल्प है। प्रश्न से मूल ऑनस्टार्ट कोड का उपयोग ...

if(mFragment == null) 
    { 
     mFragment = onCreatePane();  
     mFragment.setArguments(Utils.intentToFragmentArguments(getIntent())); 

     Log.w(TAG, "Fragment creation counter = " + createCounter); 
     createCounter++; 

     getSupportFragmentManager() 
     .beginTransaction() 
     .add(R.id.root_container,mFragment) 
     .commit(); 
    } 

...आप replace बजाय add टुकड़ा सकता है:

if(mFragment == null) 
    { 
     mFragment = onCreatePane();  
     mFragment.setArguments(Utils.intentToFragmentArguments(getIntent())); 

     Log.w(TAG, "Fragment creation counter = " + createCounter); 
     createCounter++; 
    } 

    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(R.id.root_container,mFragment) 
    .commit(); 

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

+1

यह प्रोत्साहित नहीं है। अगर खंड में गतिविधि के उदाहरण के लिए कोई संदर्भ है; सीधे या एक सदस्य के माध्यम से एक दृश्य के माध्यम से, यह स्मृति रिसाव का कारण बन जाएगा। – frostymarvelous

1

:

if(savedInstanceState == null) 
    { 
     mFragment = onCreatePane();  
     mFragment.setArguments(Utils.intentToFragmentArguments(getIntent())); 

     getSupportFragmentManager() 
     .beginTransaction() 
     .add(R.id.root_container,mFragment) 
     .commit(); 
    } 
    else 
    { 
     mFragment = getSupportFragmentManager().findFragmentById(R.id.root_container); 
    }