2012-04-01 15 views
6

लोड नहीं करता है मेरे पास मुख्य टैबएक्टिविटी है जिसमें दो टैब, ए और बी (अभी के लिए) हैं। टैब ए एक फ्रैगमेंट एक्टिविटी (नीचे दिया गया कोड) लोड करता है जो सिर्फ FrameLayout को संगत करता है, इसलिए मैं उस विशिष्ट टैब के लिए अपने टुकड़े लोड कर सकता हूं।FragmentManager.popBackStack() केवल पिछले Fragment

पहली फ्रैगमेंट में कुछ टेक्स्ट व्यू और एक ListView है। डेटा एक वेब सेवा से खींचा जाता है। जब मैं किसी सूची दृश्य आइटम पर क्लिक करता हूं, तो मैं उस आइटम के विवरण को किसी अन्य खंड में लोड करता हूं (यह एक वेब सेवा से भी आता है) और वर्तमान विवरण (सूची दृश्य और अन्य नियंत्रणों के साथ) को एक और विस्तार खंड के साथ प्रतिस्थापित करें।

इसे प्राप्त करने के लिए, मैं एंड्रॉइड-सपोर्ट-v4.jar लाइब्रेरी का उपयोग करके फ्रैगमेंट्स को पसंद करने के लिए उपयोग कर रहा हूं।

टैब ए के FragmentActivity के XML:

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

     <FrameLayout 
      android:id="@+id/updates_frame" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@drawable/background"/> 
    </LinearLayout> 

टैब ए के FragmentActivity जावा कोड:

public void onFeedSelected(Feed feed); 
public void onBackPressed(); 

:

public class UpdatesFragmentActivity extends FragmentActivity implements 
    IUpdateNotifier { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.updates); 

     //Load Initial Fragment into FrameLayout 
     //I am adding this Fragment to BackStack 
     Fragment newFragment = new UpdatesFragment(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.addToBackStack(null); 
     ft.add(R.id.updates_frame, newFragment); 
     ft.commit(); 
    } 

    //This is an Interface method which I call with the clicked "FEED" object to load its detail in another Fragment 
    @Override 
    public void onFeedSelected(Feed feed) { 
     // Instantiate a new fragment. 
     Fragment newFragment = new FeedDetailFragment(feed); 

     // Add the fragment to the activity, pushing this transaction 
     // on to the back stack. 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.updates_frame, newFragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 

    //This is another Interface Method which I call when the user presses "BACK". 
    //I am trying to load the previously loaded Fragment, which I added to BackStack. 
    //But this causes reconstruction of the previously loaded fragment. LIST in this case 
    //which call the web service. I DONT WANT TO CALL SERVICE AGAIN. 
    @Override 
    public void onBackPressed() { 
     FragmentManager fm = getSupportFragmentManager(); 
     if (fm.getBackStackEntryCount() > 0) { 
      fm.popBackStack(); 
     } 
    } 
} 

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

  1. मैं टुकड़ा है जो एक ListView है से onFeedSelected (फ़ीड फ़ीड) कहते हैं। मैं क्लिकेड फीड आइटम को मूल फ्रैगमेंट एक्टिविटी में भेजता हूं, इसलिए यह एक और टुकड़ा लोड करता है जिसमें उस फ़ीड विवरण शामिल होता है।
  2. मैं पर कॉल करता हूं बैकप्रेस() दूसरी फ़ीड विवरण से फ्रैगमेंट जब उपयोगकर्ता एक बटन दबाता है जिसे पहले खंड को वापस लाने के लिए माना जाता है जिसमें अन्य नियंत्रणों के साथ ListView शामिल होता है। आप देख सकते हैं, मुझे लगता है कि पहले टुकड़ा वापस लाने के लिए FragmentManager के popBackStack() विधि कॉल करने के लिए प्रयास करें ...

लेकिन पहले टुकड़ा ताजा हो जाता है और वेब सेवा से लोड सभी डेटा।

असल में मैं केवल एक बार डेटा प्राप्त नहीं कर सकता और न ही कुछ समय अंतराल पर अपडेट अक्सर होता हूं। उपयोगकर्ता जब चाहें सूची को अपडेट कर सकता है। प्रारंभ में, सूची सेवा से शीर्ष 10 आइटम लोड करती है, और फिर उपयोगकर्ता सूची के अंत में "अधिक" बटन पर क्लिक कर सकता है यदि वह अधिक आइटम लोड करना चाहता है।

यह अगले 10 आइटम लोड करेगा और इसी तरह। लेकिन मुझे लगता है कि मैं कुछ चर में अपडेट्स फ्रैगमेंट एक्टिविटी में पुनर्प्राप्त ArrayList को स्टोर कर सकता हूं और फिर उस सेवा को डेटा लोड करने के बजाय सूची के एडाप्टर में केवल ऐरेलिस्ट को फिर से सौंप सकता हूं, लेकिन मुझे नहीं पता कि फ्रैगमेंट को सेवा को फिर से कॉल नहीं करना है।

मैं चाहता हूं कि जब मैं टैब 2 पर क्लिक करता हूं और फिर टैब 1 पर फिर से व्यवहार करता हूं। यह केवल लोड किए गए डेटा को दिखाता है जैसे कि छुपा हुआ था और सेवा को कॉल नहीं करता है।

मैं इसे कैसे प्राप्त कर सकता हूं?

+0

क्या आपको कोई समाधान मिला –

उत्तर

4

चिंताओं के खराब अलगाव के कारण आपका डिज़ाइन पैटर्न त्रुटिपूर्ण है। डेटा को अपडेट करना यूआई से डीकॉप्लेड किया जाना चाहिए, इससे पहले कि जब कोई उपयोगकर्ता पिछले फ्रैगमेंट पर वापस जाता है तो उसे वेब सेवा से डेटा लोड करने के साथ कुछ लेना देना चाहिए।

कुछ आसान फिक्स हैं लेकिन मुझे नहीं पता कि समस्या का थोड़ा सा संदर्भ देने के बाद आप सबसे अच्छा क्या करेंगे।

पहला विकल्प स्टार्टअप पर एक स्पलैश स्क्रीन पेश करना होगा। यह गतिविधि वेब सेवा से आपको आवश्यक डेटा डाउनलोड करने के लिए AsyncTask का उपयोग करेगी। यह ठीक काम करता है अगर आप केवल ऐप के रनटाइम के दौरान डेटा डाउनलोड करना चाहते हैं। आप सुनिश्चित करेंगे कि इस गतिविधि को इतिहास में न जोड़ें ताकि जब अगली गतिविधि से वापस दबाया जाए, तब ऐप बाहर निकल जाएगा।

एक और विकल्प, जिसे मैंने कई ऐप्स में उपयोग किया है और जिसे मैं पसंद करता हूं, AlarmManager के माध्यम से अलार्म का उपयोग है। आप विशिष्ट समय अंतराल पर आवधिक अपडेट सेट कर सकते हैं, अलार्ममेनगर आपको उस बिंदु तक भी मदद करता है जहां इसमें समय की गणना होती है। अलार्म broadcast receiver ट्रिगर करेगा जो आपके कस्टम कोड को निष्पादित करेगा, जो आपको वेब सेवा से आवश्यक डेटा डाउनलोड करेगा और इसे स्टोर करेगा।

इस दृष्टिकोण पर एक ट्यूटोरियल है, जो यहां http://android.arnodenhond.com/tutorials/alarm-notification पाया जा सकता है।

अंत में; आपको इस समस्या को हल करने के लिए बैक स्टैक को पॉप करने की आवश्यकता नहीं है, हालांकि आप इसे पूरी तरह से अलग कारणों से कर रहे हैं लेकिन बिना किसी जानकारी के बताना मुश्किल है।

+0

मुझे इस मुद्दे के बारे में पर्याप्त जानकारी प्रदान करने के लिए वास्तव में खेद है। मैंने अपना प्रश्न अपडेट कर लिया है ... अब आप इसे देख सकते हैं ... मैंने अपनी समस्या को समझाने की कोशिश की है। – Aamir

+0

मैं अपना जवाब बदल नहीं रहा हूं क्योंकि मैं इस बात से सहमत नहीं हूं कि आपने सर्वोत्तम दृष्टिकोण चुना है। उपर्युक्त उत्तर आपको सही दिशा में ले जाना चाहिए। –

+0

असल में मैं केवल एक बार डेटा प्राप्त नहीं कर सकता और न ही अपडेट कुछ समय में अपडेट करता हूं, उपयोगकर्ता जब चाहें सूची को अपडेट कर सकता है .. प्रारंभ में सूची सेवा से शीर्ष 10 आइटम लोड करती है, तो उपयोगकर्ता "अधिक" बटन पर क्लिक कर सकता है सूची के अंत में यदि वह अधिक वस्तुओं को लोड करना चाहता है। यह अगले 10 आइटम लोड करेगा .. और इसी तरह। कठिन मैं सराहना करता हूं कि आपने मुझे अलार्ममेनगर को इंगित किया है, जिसका मैं कुछ परिदृश्य में उपयोग करता हूं जहां आवधिक अपडेट की आवश्यकता होती है, लेकिन मुझे नहीं लगता कि मैं इस स्थिति में अलार्ममेनगर का उपयोग कर सकता हूं .. लेकिन मुझे लगता है कि मैं फ्रैगमेंट एक्टिविटी में कुछ चर में पुनर्प्राप्त ArrayList को स्टोर कर सकता हूं। – Aamir

2

आपका प्रश्न काफी स्पष्ट नहीं है, और अधिक सरल और सटीक सवाल पूछने ... और जैसा कि आप

ऊपर कहना

popBackStack पिछले टुकड़ा लोड नहीं करता है, यह आम तौर पर पूरे ढेर पॉप किया जाता है:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

एक और टुकड़ा

beginTransaction() 
replace() Or add() 
commit() 

सब मैं उस सवाल का

के साथ के बारे में सोच सकते हैं है कि लोड करने से पहले

शुभकामनाएं

+0

मेरा समाधान खंड थामैंजर.popBackStack (0, FragmentManager.POP_BACK_STACK_INCLUSIVE); – JWqvist

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

  • कोई संबंधित समस्या नहीं^_^