2012-11-28 13 views
7

की कंटेनर आईडी नहीं बदल सकता है, मैं यह चाहता हूं कि मैं अपने एप्लिकेशन को टैबलेट पर क्या करना चाहूंगा।एक अलग कंटेनर में एंड्रॉइड खंड को स्थानांतरित करें

----------------- 
| | | | | 
| | | | | 
|(0)| X | X | X | 
| | | | | 
| | | | | 
----------------- 
becomes 
----------------- 
| | | | | 
| | | | | 
|(0)|(1)| X | X | 
| | | | | 
| | | | | 
----------------- 
and then 
----------------- 
| | | | | 
| | | | | 
|(0)|(2)|(1)| X | 
| | | | | 
| | | | | 
----------------- 
etc... 

Fragment0 कभी नहीं चलता है, अन्य लोगों को सही करने के लिए स्थानांतरित कर दिया जाता है: टुकड़ा (0) कुछ मेनू कि टुकड़े (1) ... (एन) इस तरह प्रदर्शित होता है। दाईं ओर किनारे से निकलने वाले टुकड़े नष्ट हो जाएंगे।

तो मैं सेटअप एक क्षैतिज LinearLayout और उचित आईडी (fragment0 ... fragment3)

मैं का दृष्टांत कर सकते हैं और प्रदर्शन fragment0 और फिर fragment1 साथ युक्त 4 FrameLayout के साथ अपने एक्सएमएल लेआउट, लेकिन मैं शिफ्ट करने में सक्षम नहीं हूँ यह करने के बाद सही करने के लिए, मैं मिलता है:

ERROR/AndroidRuntime(343): FATAL EXCEPTION: main 
java.lang.IllegalStateException: Can't change container ID of fragment ... 

केवल संबंधित प्रश्नों मैं पाया है this one और that one हैं, सभी अलग नहीं भाग्य के साथ की पेशकश की समाधान की कोशिश की।

की कोशिश की FragmentTransaction.remove().add() द्वारा पीछा किया, .replace() की कोशिश की, उन्हें विभिन्न क्रम में की कोशिश की और के माध्यम से (यहां तक ​​कि प्रतिबद्ध करने के लिए दो बार के रूप किसी को सुझाव दिया की कोशिश कर रहा) आधे रास्ते प्रतिबद्ध करने के लिए, addToBackStack() ... फिर भी प्रयास विफल कॉल करने की कोशिश।

प्रश्न यह है कि इस तरह के टुकड़े को फ्रैगमेंट ट्रान्सएक्शन के साथ ले जाना संभव है या नहीं। यदि हां, मैं गलत क्या कर रहा हूं (और बोनस, क्या यह एनिमेट करना संभव है?)। यदि नहीं, तो इसे लागू करने का सही तरीका क्या होगा?

ध्यान दें कि मैं हर बार टुकड़ों को फिर से चालू नहीं करना चाहता (प्रत्येक वेब पर कुछ प्रश्न पूछता है जो कुछ समय ले सकता है)। एक डेटा को फिर से बनाने के लिए सभी डेटा को वापस निकालना संभव है, लेकिन यदि संभव हो तो मैं ऐसा नहीं करूँगा ...

उत्तर

3

मुझे नहीं पता कि यह वही है जो आप चाहते हैं लेकिन मैंने थोड़ा नमूना बनाया आपकी समस्या के बारे में। मूल रूप से आप लेआउट फ़ाइल का उपयोग करके सही स्थानांतरित कर रहे होंगे, जिसमें उन सभी स्थानांतरण खंडों के लिए एक रैपर कंटेनर होगा। कोड नमूना उत्तर के लिए थोड़ा बड़ा है इसलिए मैंने इसे a gist that you can find here में पोस्ट किया है। उस नमूने में व्यवहार देखने के लिए प्रत्येक ListFragment की वस्तुओं (टुकड़ा 1 -> टुकड़ा 2 -> खंड 3) दबाएं।

+0

यह वही नहीं करता जो मैं ढूंढ रहा हूं, लेकिन मैं इसे करने के लिए अपना कोड बदलने की कोशिश कर रहा हूं ... अगर मैं सक्षम हूं तो मैं इसे पोस्ट करूंगा ... – Matthieu

+0

मुझे जो चाहिए वह करने में सक्षम था .. आपके द्वारा बनाए गए गिस्ट में मेरे परिवर्तनों को कैसे धक्का देना है, यह पता नहीं लगा सका, इसलिए मैंने इसे वहां रखा: https://gist.github.com/4166640 – Matthieu

+0

क्षमा करें। क्या यह एक टाइपो है, कि 'frag_fragaccordion.xml' में' RelativeLayout' के बजाय यह 'LinearLayout' होना चाहिए? – midnite

20

remove() फ़ंक्शन का उपयोग करके खंड का हां कंटेनर बदला जा सकता है।

यहां समस्या commit() है। यह एक एसिंक्रोनस कॉल है, और इसे मुख्य थ्रेड पर शेड्यूल करेगा। तो FragmentManager को अन्य कंटेनर में जोड़ने से पहले इसे तुरंत करने के लिए मजबूर करने के लिए।

इसके लिए हमें executePendingTransactions() फ़ंक्शन का उपयोग करना होगा। कॉल करने के बाद इसे नए कंटेनर में टुकड़ा जोड़ने का प्रयास करें।

डॉक्स: executePendingTransactions()

कोड नमूना:

FragmentManager fManager = getSupportFragmentManager(); 
FragGroups fragGroups = (FragGroups) fManager.findFragmentByTag("groups"); 
if (fragGroups != null) { 
    fManager.beginTransaction().remove(fragGroups).commit(); 
    fManager.executePendingTransactions(); 
} else { 
    fragGroups = new FragGroups(); 
} 
if (mTwoPane) { 
    fManager.beginTransaction().replace(R.id.fragment_container_groups, fragGroups, "groups").commit(); 
} else { 
    fManager.beginTransaction().replace(R.id.fragment_container, fragGroups, "groups").commit(); 
} 

का आनंद लें।फ़ीड-बैक

संपादित

स्वागत कर रहे हैं मैं एक यहाँ एक बिंदु जोड़ने के लिए चाहते हैं। जैसा कि मुझे एक ही समस्या थी, इस धागे में आया और सुझाए गए परिवर्तनों को लागू किया। समस्या अभी भी बनी हुई है। फिर मैंने इस धागे को आखिरी टिप्पणी में देखा जिसने मेरी समस्या हल की: लेनदेन करने के दौरान addToBackStack() विधि को हटाएं या यदि आप जानबूझकर इसका उपयोग कर रहे हैं, तो उसे किसी अन्य कंटेनर में जोड़ने से पहले बैक स्टैक से टुकड़ा हटा दें। उम्मीद है कि यह भविष्य के पाठक की मदद करेगा।

+1

उत्कृष्ट जवाब! मूल प्रश्न क्या नहीं ढूंढ रहा था, लेकिन मुझे यह बेहद उपयोगी नहीं मिला। –

+2

पवन ..... मैं तुम्हें भी नहीं जानता .... तुम मुझे भी नहीं जानते .... लेकिन मेरे दोस्त, मेरे लिए आपके लिए कुछ गंभीर प्यार है। – dell116

+0

@TomR मुझे खुशी है कि आपको यह उपयोगी लगता है :) –

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