2013-09-25 10 views
7

मुझे दो टुकड़ों के बीच स्विच करने वाली एक ही गतिविधि करने का सबसे अच्छा तरीका है।दो टुकड़ों के बीच स्विच करने का सबसे अच्छा तरीका

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

  1. एक मूल गतिविधि है कि दो संभव टुकड़े में से एक प्रदर्शित कर सकते हैं:

    यहाँ विस्तार से स्थिति है।

  2. दो टुकड़ों में यह कहा गया है कि मैं एक सत्र में जारी रहना चाहता हूं, लेकिन सत्रों के बीच जरूरी नहीं है।
  3. कई अन्य गतिविधियां, जैसे कि मूल गतिविधि और टुकड़े पीछे की ढेर में दफन हो सकते हैं और कम स्मृति के कारण नष्ट हो जाते हैं।
  4. मैं टुकड़ों के बीच स्थानांतरित करने के लिए बैक बटन का उपयोग करने की क्षमता चाहता हूं (इसलिए जैसा कि मैं इसे समझता हूं, मैं setRetainInstance का उपयोग नहीं कर सकता)।

    1. माता पिता गतिविधि कम मेमोरी के कारण नष्ट हो जाता है, तो मैं कैसे गारंटी नहीं है कि दोनों टुकड़ों के राज्यों बनाए रखी जाएगी:

    सामान्य वास्तुकला सलाह के अलावा, मैं बकाया सवालों निम्नलिखित है , इस पोस्ट के अनुसार: When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?। क्या मुझे पैरेंट गतिविधि में प्रत्येक टुकड़े के लिए सिर्फ एक सूचक की आवश्यकता है?

  5. पेरेंट गतिविधि के लिए यह ट्रैक रखने का सबसे अच्छा तरीका क्या है कि यह वर्तमान में किस खंड को प्रदर्शित कर रहा है?

अग्रिम धन्यवाद!

उत्तर

6

मैं समर्थन खंड प्रबंधक का उपयोग करके दोनों टुकड़ों को जोड़ना समाप्त कर दिया और फिर उनके बीच स्विच करने के लिए अलग/संलग्नक का उपयोग कर समाप्त कर दिया।मैं commitAllowingStateLoss() का उपयोग करने में सक्षम था क्योंकि मैं कहीं और दृश्य की स्थिति को बरकरार रखता हूं, और मैन्युअल रूप से सही खंड को रेज़्यूम() में सेट करता हूं।

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.my_layout, new AFragment(), TAG_A); 
    fragmentTransaction.add(R.id.my_layout, new BFragment(), TAG_B); 
    fragmentTransaction.commit(); 
} 

public void onResume() { 
    super.onResume(); 
    if (this.shouldShowA) { 
     switchToA(); 
    } else { 
     switchToB(); 
    } 
} 

private void switchToA() { 
    AFragment fragA = (AFragment) getSupportFragmentManager().findFragmentByTag(TAG_A); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.detach(getSupportFragmentManager().findFragmentByTag(TAG_B)); 
    fragmentTransaction.attach(fragA); 
    fragmentTransaction.addToBackStack(null); 

    fragmentTransaction.commitAllowingStateLoss(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 
2

आप अपने माता-पिता गतिविधि में ViewPager का उपयोग करने पर विचार करना चाहेंगे ताकि आप टुकड़े के बीच स्विच कर सकें।

तो आप उनके माध्यम से स्वाइप करने में सक्षम होंगे।

यदि आप किसी सत्र के दौरान अपने राज्य को जारी रखना चाहते हैं, भले ही माता-पिता की गतिविधि नष्ट हो जाए, तो आपको उन्हें Parcelable बनाना होगा, ताकि आप उस समय राज्य को सहेज सकें, भले ही कक्षा उस समय तत्काल नहीं हो। यदि आप अपने डिवाइस को घूर्णन करते हैं और स्क्रीन पर वर्तमान स्थिति/डेटा रखना चाहते हैं तो आपको यह करने की भी आवश्यकता है।

आपको उन्हें Parcelable पर विधियों में लिखना चाहिए और उन्हें onResume में से इसे फिर से बनाना चाहिए। इस तरह इससे कोई फर्क नहीं पड़ता कि वे नष्ट हो गए हैं या डिवाइस अभिविन्यास में बदलावों के कारण पुनर्निर्मित किया जाना है।

यदि आप बैकबटन के साथ उन टुकड़ों के बीच स्विच करने में सक्षम होना चाहते हैं, तो आप onBackPressed के लिए बटन क्लिक कर सकते हैं और तदनुसार इसे संभाल सकते हैं।

यदि आपको यह पता लगाने की आवश्यकता है कि किसी दिए गए समय पर आप किस फ्रेमिंग को प्रदर्शित करते हैं तो आप अपने ViewPager से उस समय क्या फ्रेगमेंट प्रदर्शित कर रहे हैं, इसलिए आपको ट्रैक रखना नहीं है, तो आप केवल किसी ऐसे व्यक्ति से पूछ सकते हैं जो जानता है, अगर आपको इसे जानना होगा।

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे नहीं लगता कि मैं यहां एक पेज पेजर का उपयोग कर सकता हूं, क्योंकि विचारों को स्वाइप नहीं किया जाना चाहिए। हालांकि मैं निश्चित रूप से पार्सलबल लागू करूँगा। मैं बैकप्रेस पर कहां लागू करूं? – GLee

+0

OnBackPressed एक गतिविधि का एक तरीका है। तो आपको वहां इसे ओवरराइड करना होगा। –

संबंधित मुद्दे