2012-02-09 10 views
33

enter image description hereएंड्रॉयड टुकड़ा निकालें और BackStack

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

public static void goToNextFragement(Fragment fragment, int container, boolean addToBackStack, Fragment ctx) 
    { 
     // Create new fragment and transaction 
     FragmentTransaction transaction = ctx.getSupportFragmentManager().beginTransaction(); 
     transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); 
     // Replace whatever is in the fragment_container view with this fragment, 
     // and add the transaction to the back stack 
     transaction.replace(container, fragment); 

     if(addToBackStack) 
      transaction.addToBackStack(null); 

     // Commit the transaction 
     transaction.commit(); 
    } 

सेल्सियस के लिए बी से लेन-देन में मैं झूठे के रूप में बूलियन addToBackStack सेट ताकि transaction.addToBackStack(null); नहीं बुलाया जाता है:

मैं निम्नलिखित FragmentHelper विधि है। यह फिर से अच्छी तरह से काम करता है लेकिन बाद में मेरी समस्या शुरू होती है।

उपयोगकर्ता एक करने के लिए सी और रिटर्न पर वापस दबाता है मैं अभी भी ए के मद्देनजर

किसी भी मदद की सराहना की जाएगी तहत सी की बढ़ी हुई दृश्य देख सकते हैं। मुझे उम्मीद है कि मेरा चित्र इस सरल को रखने में मदद करता है।

उत्तर

1

तरीके इस संभाल करने के युगल:

  1. मैं अपने अनुप्रयोग में एक समान प्रवाह और जिस तरह मैं हल यह एक AlertDialog कि मुख्य गतिविधि से निकाल दिया गया है के साथ लॉगिन टुकड़ा की जगह के द्वारा किया गया था। तो आपके मामले में, खंड ए स्क्रीन पर दिखाई देता है और यदि मुख्य गतिविधि सोचती है कि इसे लॉगिन संवाद दिखाने की ज़रूरत है, तो यह अलर्टडिअलॉग दिखाता है। यह मेरे लिए काम किया।

  2. जब खंड ए सक्षम है, तो यह जांच कर सकता है कि खंड सी को FragmentManager से पूछकर आसपास है या नहीं। यदि यह मौजूद है तो इसे हटा दें।

+0

अलर्टडिअलॉग जाने का रास्ता था। अपने अनुभव साझा करने के लिए धन्यवाद। –

+16

यह एक वास्तविक समाधान नहीं बल्कि एक समाधान है, है ना? – Brian

+2

यह स्वीकार्य उत्तर –

0

एफएम को यह नहीं बता रहा कि आप बी से सी में संक्रमण को बैकस्टैक में जोड़ना चाहते हैं, इसका मतलब है कि जब आप वापस हिट करते हैं, तो एफएम में सी जोड़ने का कोई रिकॉर्ड नहीं होता है, इसलिए यह इसे हटा नहीं देता है।

+0

ठीक है मैंने सोचा कि शायद मामला, मदद के लिए असभ्य लगने के जोखिम पर, जो मैं नहीं हूं) यह समस्या का विश्लेषण प्रदान करता है, समाधान नहीं। क्या आपके पास काम करने के लिए कोई विचार है/इसे ठीक करें? –

+0

मेरे सिर के ऊपर से, आप मैन्युअल रूप से उस टुकड़े को हटा सकते हैं, लेकिन शायद यह सबसे अच्छा विकल्प नहीं है। इसके अलावा, आपको अपना होमवर्क करना होगा। –

21

मैं इस .. हल एक लाइन के भीतर ...

getFragmentManager().popBackStack(); 

या

getSupportFragmentManager().popBackStack() 

इस काम करता है जब आप टुकड़ों को जोड़ने और backstack बनाए रखने (जगह नहीं) कर रहे हैं।

+0

वास्तविक उत्तर नहीं है, धन्यवाद –

+1

जब आप खंड 3 दिखाने के लिए 2 से 3 सिस्टम से पहले बैकस्टैक पॉप करते हैं तो प्रत्येक बार जब आप खंड संख्या को पॉप करते हैं तो यह खंड संख्या (एन -1) दिखाने की कोशिश करता है। और यदि आप खंड 3 पर जाने के लिए मजबूर हैं तो आपको 1 खंड के क्रिएटिव्यू के दौरान एनपीई मिलेगा ... – Yazon2006

6

f1 -> f2 साधारण यहाँ से बाहर

Fragment2 f2 = new Fragment2(); 
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content,f2).addToBackStack(null).commit(); 

कुछ भी नहीं। खंड F2 में से यह कोड आपको खंड f3 पर ले जाता है।

f2 -> f3

Fragment3 f3 = new Fragment3(); 
getActivity().getSupportFragmentManager().popBackStack(); 
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit(); 

मैं डॉक्स अगर यह काम करना चाहिए, इस Poping लेनदेन विधि के अतुल्यकालिक होने की, और शायद एक बेहतर तरीका popBackStackImmediate कॉल करने के लिए किया जाएगा कहा जाता है कि पढ़ कर यकीन नहीं है() । लेकिन जहां तक ​​मैं अपने उपकरणों पर बता सकता हूं कि यह बेकार ढंग से काम कर रहा है।

उक्त विकल्प होगा:

final FragmentActivity activity = getActivity(); 
activity.getSupportFragmentManager().popBackStackImmediate(); 
activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit(); 

यहाँ वहाँ वास्तव में f3 पर जाने से beofre वापस f1 के लिए जा रहा संक्षिप्त हो जाएगा, तो एक मामूली गड़बड़ वहाँ।

यह वास्तव में तुम सब करने की है और इस answer भी आप बहुत मदद कर सकते हैं ..

+0

आपका समाधान मेरे मुद्दे के लिए बहुत ही सही है, आप अपना समय नेपस्टर बचाते हैं। –

0

चरण 1: जब आप टुकड़ा एक में हैं और टुकड़ा बी खोलना चाहते हैं

getFragmentManager().beginTransaction() 
.replace(android.R.id.content, new FragmentB(), FragmentB.class.getName() 
.addToBackStack(null) 
.commit(); 

चरण 2: जब आप टुकड़ा बी में हैं, और टुकड़ा सी खोलना चाहते हैं

getFragmentManager().beginTransaction() 
.replace(android.R.id.content, new FragmentC(), FragmentC.class.getName() 
.disallowAddToBackStack() // << this to make Fragment B, not included in the backstack 
.commit(); 

चरण 3: जब टुकड़ा सी में you'in, और दबाने डिवाइस वापस बटन या getFragmentManager().popBackStack(); आप फ्रैगमेंट ए खोलने वाला होगा

पीएस: गतिविधि में यह getSupportFragmentManager() का उपयोग करें। यदि आप फ्रैगमेंट में हैं तो getFragmentManager()

0

हाय मैं बस मुझे मिला सुरुचिपूर्ण समाधान साझा करना चाहता था।

public static void performNoBackStackTransaction(FragmentManager fragmentManager, String tag, Fragment fragment) { 
final int newBackStackLength = fragmentManager.getBackStackEntryCount() +1; 

fragmentManager.beginTransaction() 
    .replace(R.id.content, fragment, tag) 
    .addToBackStack(tag) 
    .commit(); 

fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
    int nowCount = fragmentManager.getBackStackEntryCount(); 
    if (newBackStackLength != nowCount) { 
     // we don't really care if going back or forward. we already performed the logic here. 
     fragmentManager.removeOnBackStackChangedListener(this); 

     if (newBackStackLength > nowCount) { // user pressed back 
     fragmentManager.popBackStackImmediate(); 
     } 
    } 
    } 
}); 
} 

Source with explained logic

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