2017-01-26 1 views
2

ersetze Ich habe zwei Fragmente (FRAGMENT_1, FRAGMENT_2). FRAGMENT_1 führt einen Timer aus und wenn ich FRAGMENT_2 öffne, möchte ich, dass FRAGMENT_1 es weiter ausführt.Android onDetach() nicht aufgerufen, wenn ich das Fragment

FRAGMENT_1 in onCreate():

if (savedInstanceState == null) { 
    FRAGMENT_1 fragment1= new FRAGMENT_1(); 
    fragment1.setRetainInstance(true); 
    getSupportFragmentManager() 
     .beginTransaction() 
     .add(R.id.main_fragment_container, fragment1, FRAGMENT_1_TAG) 
     .addToBackStack(null) 
     .commit(); 
} 

Diese meine Navigation zwischen den Fragmenten ist:

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 
    Fragment fragment = null; 
    String fragTag = ""; 
    switch (id) { 
     case R.id.nav_frag_1: 
      //this method returns 
      //getSupportFragmentManager().getFragments() 
      //.contains(getSupportFragmentManager().findFragmentByTag(tag)) 
      if (isFragmentCreated(FRAGMENT_1_TAG)) { 
       fragment = getSupportFragmentManager() 
         .findFragmentByTag(FRAGMENT_1_TAG); 
      } else { 
       fragment = new FRAGMENT_1(); 
      } 
      fragTag = FRAGMENT_1_TAG; 
      break; 

     case R.id.nav_frag_2: 
      fragment = new FRAGMENT_2(); 
      fragTag = FRAGMENT_2_TAG; 
      break; 

     case R.id.nav_settings: 
      Intent intent = new Intent(this, SettingsActivity.class); 
      startActivity(intent); 
      break; 

    } 
    if (fragment != null && !fragment.isVisible()) { 
     FragmentTransaction fragmentTransaction = getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.main_fragment_container, fragment, fragTag); 
     if (fragment.getTag().equals(FRAGMENT_1_TAG)){ 
      fragmentTransaction.addToBackStack(null); 
     } 
     fragmentTransaction.commit(); 
    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

Wenn ich zwischen diesen Fragmenten navigieren, wird FRAGMENT_2 nicht onDetach() rufen daher ist es nicht entfernt, aber wenn ich das folgende Stück Code entferne:

if (fragment.getTag().equals(TIMER_FRAGMENT_TAG)){ 
    fragmentTransaction.addToBackStack(null); 
} 

dann ruft FRAGMENT_2 onDetach() und wird dann entfernt. Warum passiert dies?

Antwort

0

In Fragment Lifecycle-Methoden für Anrufe mit dieser wiederum onPause() zu zerstören -> OnStop() -> onDestroyView() -> onDestroy() -> onDetach().

addToBackStack(null) Methode fügt Fragment zu Backstack, dh es Fragment Instanz speichern und wenn Fragment unsichtbar wurde, Systemaufrufe Fragment onDestroyView() Methode, da Ansicht zerstört wird, aber nachdem es tun System keine Anrufe Methode onDestroy() weil Fragment Instanz in Backstack gespeichert und nicht zerstört. Und wenn die Instanz nicht zerstört wird, hält das System diese Instanz an die Aktivität gebunden und ruft sie nicht onDetach() an.

+1

Ich weiß nicht, warum das nicht gemocht wurde. Es hat in meinem Fall funktioniert, danke! – ioanb7

Verwandte Themen