2012-04-03 15 views
8

मेरे पास दोहरी फलक के साथ एक गतिविधि है: बाईं ओर मेनू आइटम की एक सूची (खंड एम) और दाईं ओर स्थित चयनित आइटम का विवरण (खंड डी)।एंड्रॉइड ऑन कॉन्फ़िगरेशन चेंज: कैसे खंड को वापस सहेजने और पुनर्स्थापित करने के लिए?

जब उपयोगकर्ता खंड डी में कोई आइटम चुनता है, तो खंड डी को दूसरे खंड के साथ बदल दिया जाता है (चलिए इसे डी 1 कहते हैं)। जब उपयोगकर्ता खंड डी 1 में कोई आइटम चुनता है, तो खंड डी 1 को दूसरे खंड के साथ बदल दिया जाता है (चलिए इसे डी 2 कहते हैं), और इसी तरह। बेशक, जब उपयोगकर्ता बैक बटन दबाता है तो वह टुकड़े के इतिहास में वापस जा सकती है: डी 2-> डी 1-> डी।

मेरी समस्या यह है: मैं कॉन्फ़िगरेशन परिवर्तन (विशेष रूप से, स्क्रीन अभिविन्यास पर) पर पूर्ण खंड वापस ढेर को कैसे सहेज सकता हूं और पुनर्स्थापित कैसे कर सकता हूं?

यह मेरे लिए बहुत अजीब लगता है कि किसी और को इससे पहले कोई समस्या नहीं थी, लेकिन मुझे Google और स्टैक ओवरफ़्लो पर मेरी खोजों के दौरान इसके बारे में कुछ भी नहीं मिला। अगर मुझे कोई प्रासंगिक पोस्ट याद आया, तो कृपया मुझे इसका समाधान करें।

मुझे पता है कि मैं गतिविधि मनोरंजन से बचने के लिए अपनी गतिविधि में android:configChanges="orientation|screenSize" विशेषता जोड़ सकता हूं, लेकिन मैं बस ऐसा नहीं कर सकता।

कारण मैं ऐसा नहीं कर सकता कि मैं पिछड़ा संगतता के लिए एक्शन बार शेरलॉक (बनाम 4) का उपयोग कर रहा हूं और उस घटक को कॉन्फ़िगरेशन परिवर्तन, AFAIK पर सही ढंग से व्यवहार करने के लिए गतिविधि मनोरंजन की आवश्यकता है।

यदि गतिविधि को नष्ट करने और फिर से बनाने के बिना एक्शन बार शेरलॉक घटक को फिर से बनाने का दूसरा तरीका है तो कृपया मुझे बताएं।

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

उत्तर

0

एक्शन बार शेरलॉक (एबीएस) को एबीएस 3.x में गतिविधि को पुनर्जीवित करने के हिस्से के रूप में एक्शन बार को फिर से बनाने की आवश्यकता है, लेकिन @Jake Wharton's comment के अनुसार, संस्करण 4 को मनोरंजन की आवश्यकता नहीं है - यह अभिविन्यास परिवर्तनों को नियंत्रित कर सकता है। तो, एंड्रॉइड सेट करें: configChanges = "ओरिएंटेशन" और आपका खंड वापस स्टैक जारी रहेगा।

+1

@ Iarham1 आपके उत्तर के लिए धन्यवाद, लेकिन दुर्भाग्यवश, एबीएस 4 में अभी भी कुछ ओएस संस्करणों (जैसे 2.3.7) पर कुछ समस्याएं हैं जब एंड्रॉइड: configChanges = "ओरिएंटेशन" सेट है, जैसा कि [अंक # 279] में वर्णित है (https://github.com/JakeWharton/ActionBarSherlock/issues/279#issuecomment-4934511), इसलिए वर्तमान में यह व्यवहार्य समाधान नहीं है। मुझे आशा है कि जेक व्हार्टन इसे निकट भविष्य में ठीक कर देगा, लेकिन, इस बीच, क्या आप या किसी और को पता है कि कॉन्फ़िगरेशन परिवर्तन पर पूर्ण खंड वापस ढेर को कैसे सहेजना और पुनर्स्थापित करना है? या वैकल्पिक रूप से कॉन्फ़िगरेशन परिवर्तन पर केवल एबीएस को प्रोग्रामेटिक रूप से पुन: बनाने के लिए एबीएस कोड को कैसे ट्विक करें? – Luke

5

मैं फ्रैगमेंट्स को कैश करके ऐसा करने में सक्षम था क्योंकि मैंने उन्हें अपने स्वयं के ऐरेलिस्ट में जोड़ा था। फिर मैंने एक ऑनबैकस्टैक चेंज लिस्टनर स्थापित किया ताकि ट्रैक को ट्रैक किया जा सके और आवश्यकतानुसार ArrayList को पॉप कर दिया जा सके।

मेरा उद्देश्य थोड़ा अलग था लेकिन नीचे दिए गए कोड को आपके द्वारा वर्णित किए जाने वाले कार्यों के लिए आवश्यक होना चाहिए। टैग हैं इसलिए यदि आपको आवश्यकता हो तो आपके पास कई बैक स्टैक हो सकते हैं। यह संकलित नहीं होगा (मैंने अपने बहुत सारे कोड को फिसल दिया है) लेकिन आपको यह पता होना चाहिए कि मैंने यह कैसे किया। अतिरिक्त अस्वीकरण: I बस यह काम कर रहा है और ऐसे मुद्दे हो सकते हैं जिन्हें मैंने अभी तक नहीं मारा है।

public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag) 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.detach(visibleFragment); 
     ft.add(R.id.realtabcontent, fragment, tag); 
     ft.attach(fragment); 
     ft.addToBackStack(null); 
     manualBackStacks.get(tag).add(fragment); 
     ft.commit(); 
     this.getSupportFragmentManager().executePendingTransactions(); 
    } 

कोड आप जहां अपनी गतिविधि एक ओरिएंटेशन बदलने के बाद निर्मित हो जाता है चाहता हूँ:

ArrayList<Fragment> backStack = 
     new ArrayList<Fragment>(manualBackStacks.get(tag)); 
popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote 
for (int bs = 1; bs < backStack.size(); bs++) { 
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag); 
} 

backstack श्रोता:

public void onBackStackChanged() { 
    int index = getSupportFragmentManager().getBackStackEntryCount(); 
    ArrayList<Fragment> backStack = manualBackStacks.get(tag); 
    visibleFragment = backStack.get(index); 
    // Pop the last element if we've backed up. 
    popArrayListToIndex(backStack, index); 
} 

आशा इस मदद करता है।

+0

मुझे इस दृष्टिकोण में बहुत दिलचस्पी है, लेकिन मुझे नहीं लगता कि आपका जवाब आसानी से समझने के लिए पर्याप्त जानकारी देता है। क्या आप अपने उत्तर में अधिक जानकारी जोड़ सकते हैं? – deepwinter

+0

इसे से चित्रित करें, धन्यवाद! – deepwinter

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

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