2014-07-26 13 views
5

मेरा ऐप एक पताफ्रेजमेंट से शुरू होता है। NavigationDrawer से मैं (अन्य लोगों के) के साथ एक नई AddressFragment शुरू:नेविगेशन ड्रावर के साथ स्विच करते समय, एक टुकड़े का केवल एक उदाहरण कैसे रखें?

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.container, new AddressFragment()) 
       .addToBackStack(null) 
       .commit(); 

लेकिन मैं नहीं बल्कि सिर्फ पहला उदाहरण वापस जाना होगा। ऐसा कैसे किया जा सकता था?

या अधिक सामान्य, मैं कैसे पता लगा सकता हूं कि क्या एक टुकड़ा का उदाहरण पहले से मौजूद है और फिर शुरू होता है, यदि हां, तो अन्यथा कोई बनाते हैं?

उत्तर

8

जब टुकड़ा इसके लिए एक टैग बनाने से निर्धारित करते हैं, फिर बाद में आप इसे टुकड़ा के माध्यम से प्राप्त कर सकते हैं प्रबंधक और तदनुसार प्रतिस्थापित/बनाएँ।

FragmentManager fManager = getFragmentManager(); 
FragmentTransaction fTransaction = fManager.beginTransaction(); 
Fragment fragment = fManager.findFragmentByTag("uniqueTag"); 

// If fragment doesn't exist yet, create one 
if (fragment == null) { 
    fTransaction.add(R.id.fragment_list, new ListFrag(), "uniqueTag"); 
} 
else { // re-use the old fragment 
    fTransaction.replace(R.id.fragment_list, fragment, "uniqueTag"); 
} 
2

पहली बार जब आप टैग के साथ टुकड़ा बनाते हैं।

जब आप इसे टैग के साथ टुकड़ा प्राप्त करने की कोशिश बदलना चाहते हैं और अगर यह अशक्त लौट आपके द्वारा बनाए गए एक नया एक

4

चरण:

अपने आवेदन में कहीं न कहीं प्रवाह आप की आवश्यकता होगी:

एक टुकड़ा अपने ही "TAG"

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.container, new AddressFragment()) 
       .addToBackStack(**AddressFragment.class.getName()**) 
       .commit(); 

चरण दो के लिए अनुमति देने के लिए मौजूदा कोड का अनुकूलन यह निर्धारित करने के लिए कि कोई टुकड़ा मौजूद है:

public static boolean isFragmentInBackstack(final FragmentManager fragmentManager, final String fragmentTagName) { 
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) { 
     if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) { 
      return true; 
     } 
    } 
    return false; 
} 

चरण तीन:

प्रदर्शन टुकड़ा कार्रवाई

if (exists) { 
    // Fragment exists, go back to that fragment 
    //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow 
    mFragmentManager.popBackStackImmediate(AddressFragment.class.getName(), 0); 

} else { 
    // Fragment doesn't exist 
    // STEP 1 + additional backstack management 
} 
+0

मैं समाधान टुकड़ा और नहीं वापस ढेर टैग करने के लिए समझौता हुआ onbackpressed संभाल। यह भी दिलचस्प लगता है, एक और बार कोशिश कर सकते हैं। –

+0

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

+0

बैक स्टैक पॉपिंग के मामले में आप लेखक को वांछित "एक टुकड़ा का एक उदाहरण" खो देंगे – Androider

1

यह परीक्षण किया जाता है जवाब, आशा है यह मदद से आप पहले MainActivity

private static final int TIME_INTERVAL = 2000; 
private long mBackPressed; 
private FragmentManager fm; 
private FragmentTransaction ft; 
private DrawerLayout drawer; 
अब onNavigationItemSelected में

में विश्व स्तर पर इन क्षेत्र बनाओ() को लागू जैसे

@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
Fragment fragment = null; 
Class fragmentClass = null; 
switch (item.getItemId()) { 
case R.id.nav_home: 
fragmentClass = Fragment.class;//this is MainAvctivty extends AppCompatActivity 
break; 
case R.id.nav_f1: 
fragmentClass = FragmentOne.class; 
break; 
case R.id.nav_f2: 
fragmentClass = FragmentTwo.class; 
break; 
case R.id.nav_f3: 
fragmentClass = FragmentThree.class; 
break; 
case R.id.nav_f4: 
fragmentClass = FragmentFour.class; 
break; 
case R.id.nav_f5: 
fragmentClass = FragmentFive.class; 
break; 
default: 
fragmentClass = Fragment.class; 
} 
try { 
fragment = (Fragment) fragmentClass.newInstance(); 
} catch (Exception e) {e.printStackTrace();} 
//Insert the fragment by replacing any existing fragment 
fm = getSupportFragmentManager(); 
ft = fm.beginTransaction(); 
ft.replace(R.id.frame_container, fragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.addToBackStack(null); 
ft.commit(); 
item.setChecked(true); 
setTitle(item.getTitle()); 
drawer.closeDrawers(); 
return true; 
} 

अब की तरह

नीचे
@Override 
public void onBackPressed() { 
if (drawer != null) { 
fm = getSupportFragmentManager(); 
ft = fm.beginTransaction(); 
if (drawer.isDrawerOpen(GravityCompat.START)) { 
drawer.closeDrawer(GravityCompat.START); 
} else if (fm.getBackStackEntryCount() > 0) { 
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
ft.commit(); 
} else if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) { 
super.onBackPressed(); 
} else { 
Toast.makeText(this,"Press again to exit the app",Toast.LENGTH_SHORT).show(); 
} 
mBackPressed = System.currentTimeMillis(); 
} 
} 
संबंधित मुद्दे