2017-01-26 7 views
2

У меня есть два фрагмента (FRAGMENT_1, FRAGMENT_2). FRAGMENT_1 запускает таймер, и когда я открываю FRAGMENT_2, я хочу, чтобы FRAGMENT_1 продолжал его запускать.Android onDetach() не вызывается при замене фрагмента

FRAGMENT_1 в 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(); 
} 

Это моя навигация между фрагментами:

@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; 
} 

Когда я перемещаться между этими фрагментами, FRAGMENT_2 не вызывает onDetach() поэтому не удаляется, но если я удалю следующий фрагмент кода:

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

затем FRAGMENT_2 вызывает onDetach(), а затем удаляется. Почему это происходит?

ответ

0

В Фрагмент методы жизненного цикла для уничтожения вызовов с таким поворотом OnPause() -> OnStop() -> onDestroyView() -> OnDestroy() -> onDetach().

addToBackStack(null) метод добавляет фрагмент к backStack, т.е. сохранить фрагмент экземпляра и когда фрагмент стал невидимым, система вызывает фрагментировать onDestroyView() метод, потому что вид разрушен, но после того, как система не делать вызовы методов onDestroy() потому что экземпляр фрагмента сохраняется в backStack и не уничтожены. И если экземпляр не разрушен, система держит этот экземпляр прикрепленным к действию и не вызывает его onDetach().

+1

Я не знаю, почему это не понравилось. Это сработало в моем случае, спасибо! – ioanb7

 Смежные вопросы

  • Нет связанных вопросов^_^