2013-02-22 30 views
30

मेरे पास मेरी मुख्य गतिविधि में एक सूची है। यहां बताया गया है कि मैंने अपनी टुकड़ा वस्तु कैसे सेट की है।क्या ढेर के ऊपर से टुकड़ा पाने का कोई तरीका है?

FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
Fragment newFragment = new MyFragment(); 
fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag"); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 
समस्या

मुझे पता है कि टुकड़ा किस तरह वर्तमान में दिखाया जा रहा है है उपयोगकर्ता वापस प्रेस बटन, मैं करने के लिए, कम से कम,

getActionBar().setTitle(title); 
getActionBar().setDisplayHomeAsUpEnabled(isEnabled); 
invalidateOptionsMenu(); 

फोन करके कार्रवाई बार और मेनू बदल जब है , ताकि मैं जानता हूं कि एक्शन बार कैसे सेट करें। मैं विभाजन के रूप में खंड में सेटिंग विकल्प स्टोर करता हूं।

String title = fragment.getArguments().getString("KEY_TITLE"); 
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED"); 

मैं संबंधित सवाल खोज करते हैं, और मैंने महसूस किया कि मैं

MyFragment fragment = (MyFragment) getSupportFragmentManager() 
     .findFragmentByTag("tag"); 

बुला हालांकि द्वारा टुकड़ा मिल सकता है, मैं एक कस्टम ढेर सारे टैग की दुकान, और पॉप (कॉल करनी होगी) हर बार जब उपयोगकर्ता onBackPressed() में वापस बटन दबाता है।

तो, मेरा सवाल यह है कि मेरे लिए स्टैक से वर्तमान दृश्यमान खंड प्राप्त करने का कोई तरीका है?

नोट: कृपया ध्यान रखें कि टुकड़े के प्रकार अलग हैं, केवल माईफ्रैगमेंट ही नहीं।

उत्तर

52

इस तरह कुछ बात backpress पर अपनी गतिविधि यह आंकड़ा बाहर की मदद करनी चाहिए:

private Fragment getCurrentFragment(){ 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName(); 
    Fragment currentFragment = fragmentManager.findFragmentByTag(fragmentTag); 
    return currentFragment; 
} 

@Override 
public void onBackPressed() { 
    Fragment fragmentBeforeBackPress = getCurrentFragment(); 
    // Perform the usual back action 
    super.onBackPressed(); 
    Fragment fragmentAfterBackPress = getCurrentFragment(); 
} 

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

+6

ऐसा लगता है कि अगर मैं अपने तरीके से करते हैं, मैं स्थापित करने के लिए है कि * * fragmentTransaction.addToBackStack (टैग) ** साथ ही; अन्यथा, मुझे एक NullPointerException मिलेगा। तो ** fragmentManager.getBackStackEntryAt (fragmentManager.getBackStackEntryCount() - 1) .getName(); ** टैग नाम –

+1

हाँ का संदर्भ नहीं है ... आपको नल और खराब गणित की जांच करनी होगी ((getBackStackEntryCount-1)> 0 और ऐसे)।मैंने थोड़े से इसे बहुत जल्दी लिखा था। इसके अलावा, एक टैग के बिना जोड़ा गया फ्रिजमेंट शून्य के रूप में आ जाएगा। – petey

+0

क्या यह अभी भी काम करेगा यदि मैं addToBackStack (null) का उपयोग करता हूं? – umerk44

20
FragmentManager.findFragmentById(fragmentsContainerId) 

function रिटर्न शीर्ष पर backstack में Fragment लिंक। प्रयोग उदाहरण:

fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer); 
      if(fr!=null){ 
       Log.e("fragment=", f.getClass().getSimpleName()); 
      } 
     } 
    }); 
+0

यह विचित्र विचित्र लगता है ... लेकिन मेरे लिए बहुत अच्छा काम करता है :)। दस्तावेज़ कहते हैं कि यह बैकस्टैक की खोज करता है, इसलिए उम्मीद है कि यह एंड्रॉइड के सभी संस्करणों (उंगलियों को पार करने) में हमेशा स्टैक के शीर्ष से खोज करता है। – delrocco

+0

मैं इसे इतने लंबे समय से खोज रहा हूं। यह श्रोता कैसे काम करता है इसे साफ़ करने के लिए धन्यवाद – mikebertiean

1

वहां पहले से ही एक जवाब के रूप में सही चिह्नित है और मेरे अतिरिक्त जानकारी के कि उस के लिए अलग नहीं हो जाएगा। लेकिन, मुझे रिसीवर का उपयोग करते समय परेशानी मिली जब को कोशिश कर रहा है कि रिसीवर कहां से टुकड़ा वर्तमान शीर्ष स्टैक पर खंड है। आप आसानी से एनपीई और इंडेक्स में सीमा से बाहर चला सकते हैं। इसलिए मैंने इसे लिखा, शायद यह किसी की मदद करता है।

private boolean isFragmentOnTop(Activity parentActivity, final String fragmentName){ 
     FragmentManager fmManager = parentActivity.getFragmentManager(); 
     if(fmManager.getBackStackEntryCount() == 0){ 
      LOG.i("BackStack entry count is 0: " + this); 
      return false; 
     } 
     String fragmentNameOnStackTop = ""; 
     final FragmentManager.BackStackEntry topEntry = fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount() -1); 
     if(topEntry != null) { 
      fragmentNameOnStackTop = topEntry.getName(); 
     } 
     LOG.d("Got fragments name: " + fragmentNameOnStackTop); 
     return fragmentNameOnStackTop != null ? fragmentNameOnStackTop.equals(fragmentName) : false; 
    } 

ध्यान दें कि यह कुछ टुकड़ों वाले गतिविधि के लिए ठीक काम करता है। सावधान रहें कि क्या आप व्यूपेगर का उपयोग करके एक बच्चेफ्रैगमेंट प्रबंधक हैं।

और भूल नहीं है FragmentTransaction.addToBackStack(fragmentName)

0

में fragmentName स्थापित करने के लिए इस सहायक विधि ढेर के ऊपर से टुकड़ा मिलता है:

public Fragment getTopFragment() { 
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) { 
     return null; 
    } 
    String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName(); 
    return getSupportFragmentManager().findFragmentByTag(fragmentTag); 
}