2012-01-07 4 views
44

Activity layout pictureएकाधिक टुकड़ों के साथ गतिविधि के लिए वापस ढेर कैसे पॉप?

मान लें मैं एक गतिविधि है जो दो FrameLayouts शामिल है (चलो उन्हें FrameA और FrameB कहते हैं) जो बारी में प्रत्येक कोई खंड (उन्हें FragmentA1 और FragmentB1 क्रमशः कॉल)। अब, मैं निम्न के समान कोड का उपयोग कर व्यक्ति टुकड़ा लेनदेन की एक श्रृंखला ...

getFragmentManager() 
.beginTransaction() 
.replace(frameId, fragment) 
.addToBackStack(null) 
.commit(); 

... ऐसा है कि मैं FragmentA2 साथ FrameA में FragmentA1 की जगह के लिए प्रतिबद्ध है, तो मैं FragmentB1 FrameB में FragmentB2 साथ फिर मैं की जगह, FragmentA2 के साथ FragmentA2 को FragmentA3 के साथ बदलें, फिर मैं FragmentB2 को FragmentB3 के साथ फ़्रेम 2 में प्रतिस्थापित करता हूं, और अंतिम स्थिति ऊपर की तस्वीर की तरह दिखती है (जहां केवल FragmentA3 और FragmentB3 दिखाई दे रहे हैं)।

अगर मैं सही ढंग से समझता हूं कि बैक स्टैक कैसे काम करता है, तो 'बैक' दबाकर फ्रेमए और फ्रेमबी के बीच फ्रैगमेंट्स को पॉप-इन करना होगा (यह दर्शाता है कि मैंने उन्हें कैसे जोड़ा)।

क्या किसी को पता है कि फ्रेमए या फ्रेमबी पर अंतिम लेनदेन को चुनिंदा रूप से पॉप करना संभव है? (यानी अगर मैं 'पॉप FrameA' तो FrameA FragmentA3 से FragmentA2 और, बजाय, अगर मैं 'पॉप FrameB' दबाया तो FrameB वापस FragmentB3 से FragmentB2 में संक्रमण किया जा जाएगा करने के लिए वापस से संक्रमित कर दिया जाएगा दबाया)

अनुपूरक: मुझे पता है कि मैं FragmentManager.findFragmentById(int framelayoutId) विधि का उपयोग करके दिए गए फ़्रेमलेआउट में अंतिम रूप से जोड़ा गया टुकड़ा प्राप्त कर सकता हूं, लेकिन FragmentTransaction.remove(fragment).commit() पर कॉल करने से केवल फ्रैगमेंट को दृश्य से हटा दिया जाता है और दृश्य को वापस पहले से प्रदर्शित किए गए टुकड़े में परिवर्तित नहीं किया जाता है।

+1

FragmentTransaction.remove "केवल देखने से टुकड़ा निकाल देता है और दृश्य संक्रमण नहीं है", तो क्या में दिखाया जा रहा है विचार? लेकिन मैं देख सकता हूं कि यह क्यों भ्रम पैदा कर सकता है अगर एमजीआर टुकड़ों का एक ढेर रखता है लेकिन यह पता नहीं है कि कौन से लोग एक साथ दिखाई दे रहे हैं, यानी, यह कैसे पता चलेगा कि ए 2 "ए के नीचे" है जब बी 2 उनके बीच हो सकता है ढेर? – gordonwd

+0

यदि कोई दृश्य (मेरे मामले में फ़्रेमलाउट) में 'FragmentTransaction.add (int, Fragment)' विधि का उपयोग करके इसमें कई टुकड़े जोड़े गए हैं, तो 'FragmentTransaction.remove (Fragment) .commit()' को कॉल करना मुझे विश्वास है कि मैं छोड़ दूंगा फ्रेमलेआउट ने आखिरी बार फ्रैगमेंट दिखाया। हालांकि, 'FragmentTransaction.replace (int, Fragment)' विधि का उपयोग करके दृश्य में टुकड़े जोड़ना (जैसा कि मैं कर रहा हूं, यह मानते हुए कि यह स्मृति के लिए बेहतर है ?!) फ्रेमलेआउट को कम-से-कम छोड़ देगा (यानी खाली दृश्य के रूप में दिखा रहा है) ... –

+0

मेरी पिछली टिप्पणी में जोड़ने के लिए: मैं देख सकता हूं कि कुछ उपयोगी तरीके जैसे 'FragmentManager.getBackStackEntryAt (int अनुक्रमणिका)', 'FragmentManager।पॉपबैकस्टैक (स्ट्रिंग नाम, इंट फ्लैग) ', 'पॉपबैकस्टैक (इंट आईडी, इंट फ्लैग)', 'फ्रैगमेंट ट्रांज़ेक्शन.एडटीओ बैकस्टैक (स्ट्रिंग नाम)' और 'फ्रैगमेंट ट्रान्सक्शन.रेप्लेस (इंट कंटेनर व्यूआईडी, फ्रैगमेंट फ्रैगमेंट, स्ट्रिंग टैग)', बस सुनिश्चित नहीं है मुझे जो चाहिए उसे प्राप्त करने के लिए उन्हें एक साथ कैसे पूल करें ... –

उत्तर

22

मूल रूप से, नहीं, गतिविधि के लिए केवल एक बैक स्टैक है।

आपको बस अपने अलग-अलग बैक स्टैक को लागू करने की आवश्यकता होगी।

एंड्रॉइड 4.0 (और संबंधित समर्थन लाइब्रेरी) के रूप में ऐसे एपीआई हैं जो इसे अपेक्षाकृत आसान बनाना चाहिए - FragmentTransaction.detach(Fragment) आपको उसी स्थिति में एक टुकड़ा डालने देता है जब पिछली स्टैक में और FragmentManager.saveFragmentInstanceState(Fragment) आपको आगे जाने देता है और पूरी तरह से टुकड़ा वस्तु फेंक दें। संयोग से नहीं, इन्हें क्रमशः ViewPager के FragmentPagerAdapter और FragmentStatePagerAdapter को लागू करने के लिए उपयोग किया जाता है, ताकि आप इनका उपयोग करने के उदाहरण के रूप में इनके लिए कोड देख सकें।

+0

प्रतिक्रिया हैकबोड के लिए धन्यवाद। मुझे जो कुछ पता था, उसके साथ प्रगति करना पड़ा, इसलिए मैंने एक समाधान लागू किया जहां मैं _adding_ (_replacing_ की बजाय) Fragment A2 से पहले फ्रेगमेंट ए 1 छुपा रहा हूं, और इसके बाद _showing_ फ्रैगमेंट ए 1 फिर से फ्रैगमेंट ए 2 हटा दिया गया है। यह मेरे लिए काम कर रहा है लेकिन भविष्य में परियोजनाओं में वर्णित मेरे स्वयं के बैक स्टैक्स को लागू करने के साथ निश्चित रूप से जाएगा या यदि कोई अवांछित व्यवहार वर्तमान में सतह पर है: - \ धन्यवाद। –