2012-12-04 15 views
15

क्या बैक स्टैक एंड्रॉइड में नेस्टेड फ्रैगमेंट्स के साथ इंटरैक्शन का समर्थन करता है?नेस्टेड फ्रैगमेंट्स और बैक स्टैक

यदि ऐसा होता है, तो मैं क्या गलत कर रहा हूं? मेरे कार्यान्वयन में, बैक बटन पूरी तरह से इस तथ्य को अनदेखा कर रहा है कि मैंने इस लेनदेन को बैक स्टैक में जोड़ा। मुझे आशा है कि यह घोंसले वाले टुकड़ों के साथ किसी मुद्दे की वजह से नहीं है और बस मुझे कुछ गलत तरीके से कर रहा है।

निम्नलिखित कोड मेरे टुकड़े में से एक के अंदर है और जो कुछ भी नेस्टेड टुकड़ा वर्तमान में दिखाया जा रहा है के साथ एक नया टुकड़ा स्वैप करने के लिए प्रयोग किया जाता है:

 MyFragment fragment = new MyFragment(); 
    FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right); 
    ft.addToBackStack(null); 
    ft.replace(R.id.myFragmentHolder, fragment); 
    ft.commit(); 
+0

कोई भी इस ओपी देखकर ले जा सकते हैं एक और देखें, http://stackoverflow.com/questions/13418436/android-4-2-back-stack-behaviour-with-nested-fragments, जो बेहतर बताते हैं। – lcn

उत्तर

28

मैं एक ही समस्या है, मैं करने के लिए घोंसला टुकड़े चाहते हैं, और प्रत्येक नेस्टेड टुकड़े के लिए एक बैक स्टैक रखने के लिए।

लेकिन ... ऐसा लगता है कि इस मामले को v4 समर्थन लाइब्रेरी द्वारा नियंत्रित नहीं किया जाता है। पुस्तकालय में FragmentActivity कोड में, मैं पा सकते हैं:

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

mFragments गतिविधि के FragmentManager का प्रतिनिधित्व करता है, लेकिन यह नहीं लगता है इस प्रबंधक "प्रसारित" बच्चों प्रबंधकों को पॉप। का संभावित हल मैन्युअल, बच्चे प्रबंधक पर() popBackStackImmediate कॉल करने के लिए गतिविधि में इस तरह होगा FragmentActivity से विरासत में मिला:

private Fragment myFragmentContainer; 

    @Override 
    public void onBackPressed() { 
      if (!myFragmentContainer.getChildFragmentManager().popBackStackImmediate()) { 
       finish(); //or call the popBackStack on the container if necessary 
      } 
    } 

एक बेहतर तरीका नहीं हो सकता है, और एक अधिक स्वचालित तरीका है, लेकिन मेरी जरूरतों के लिए यह सब ठीक है।

+0

हम्म मैं इसे बाद में एक शॉट दूंगा और स्वीकार करता हूं कि यह काम करता है। – MikeS

+0

यह काम नहीं कर रहा प्रतीत होता है। सबसे पहले, टुकड़ों में popBackStackImmediate() विधि नहीं है (केवल FragmentManagers करते हैं)। मैंने 'this.getFragmentManager() popbackStackImmediate()' को प्रतिस्थापित करने का प्रयास किया, लेकिन मूल रूप से जो कुछ भी हो रहा था उससे अलग कुछ भी नहीं देखा। – MikeS

+1

आपने जो कुछ दिया है उसके साथ काम करने के बाद, मुझे समाधान मिला है! मैं समाधान को शामिल करने के लिए आपकी प्रतिक्रिया संपादित करूँगा और इसे स्वीकार करने के रूप में चिह्नित करूँगा क्योंकि आपने मुझे सही उत्तर के लिए सबसे अधिक रास्ता दिया है ... – MikeS

-2
@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    if (fm.getBackStackEntryCount() > 0) { 
     fm.popBackStack(); 
     return; 
    } 
    finish(); 
} 
+0

कृपया अपने उत्तर पर कुछ स्पष्टीकरण जोड़ें। – DontVoteMeDown

4

मेरे वर्तमान परियोजना में हमारे पास कई "नेस्टेड परतों" इसलिए मैं वैकल्पिक हल निम्नलिखित स्वचालित रूप से केवल शीर्ष स्तर टुकड़ा प्रबंधकों के लिए backstack पॉप ले कर आए हैं:

@Override 
public void onBackPressed() { 
    SparseArray<FragmentManager> managers = new SparseArray<>(); 
    traverseManagers(getSupportFragmentManager(), managers, 0); 
    if (managers.size() > 0) { 
     managers.valueAt(managers.size() - 1).popBackStackImmediate(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

private void traverseManagers(FragmentManager manager, SparseArray<FragmentManager> managers, int intent) { 
    if (manager.getBackStackEntryCount() > 0) { 
     managers.put(intent, manager); 
    } 
    if (manager.getFragments() == null) { 
     return; 
    } 
    for (Fragment fragment : manager.getFragments()) { 
     if (fragment != null) traverseManagers(fragment.getChildFragmentManager(), managers, intent + 1); 
    } 
} 
संबंधित मुद्दे