Фрагмент восстанавливается, но затем воссоздается в ориентации экрана.

У меня есть Activity (MainActivity) с DrawerLayout с использованием NavigationDrawerFragment в качестве меню навигации. В этом NavigationDrawerFragment при щелчке по элементу навигации startActivity(intent to MainActivity with extra) вызывается для отправки намерения, полученного в onNewIntent, на MainActivity; android:launchMode="singleTop" в манифесте; для отображения соответствующего фрагмента. В onCreate, если saveInstanceState не равен нулю, транзакция фрагмента не выполняется, потому что текущий фрагмент будет автоматически восстановлен.

Проблема в следующем: для одного фрагмента (а не для других): DashboardFragment, тот, который запущен по умолчанию, при ориентации экрана фрагмент восстанавливается, но затем создается заново.

Я вижу это с помощью отладчика: вызывается обычный процесс: действие воссоздано, фрагмент восстановлен правильно, затем фрагмент воссоздан. Я также вижу это в журналах FragmentManager (сравнивая поведение с другим фрагментом): фрагмент восстанавливается правильно, но затем я вижу фиксацию, заменяющую фрагмент новым экземпляром DashboardFragment. В коде я не вижу, откуда взялся этот коммит (я поставил точки останова во все коммиты в коде, и ни одна не вызывается).

Вы хоть представляете, почему это происходит?

Я могу разместить код по запросу, это сложное приложение, не с открытым исходным кодом, и я не уверен, какую часть здесь разместить.

Упрощенная MainActivity:

public class MainActivity extends MeerkatActivity {

    @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MeerkatApplication.get(this).getAppComponent().inject(this);
    setContentView(R.layout.base_activity_layout_withdrawer);
    setSupportActionBar(toolbar);
    navigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigationMenu);
    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
        toolbar,
        R.string.open_drawer,
        R.string.close_drawer);
    drawerLayout.addDrawerListener(drawerToggle);
    drawerLayout.setStatusBarBackground(R.color.primaryDarkColor);
    drawerToggle.syncState();
    final ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
      actionBar.setDisplayHomeAsUpEnabled(true);
      actionBar.setDisplayShowTitleEnabled(true);
    }
    //first calling before onNewIntent :
    if (savedInstanceState == null) {
      openFirstOpenableSection();
    }
    if (paneContainer != null) {
      // Enable animation
      LayoutTransition transition = new LayoutTransition();
      transition.enableTransitionType(LayoutTransition.CHANGING);
      paneContainer.setLayoutTransition(transition);
    }
  }

  private void openFirstOpenableSection() {
    int dc_id = -1;
    if(getIntent() != null){
      dc_id = getIntent().getIntExtra(EXTRA_DATACENTER_ID,-1);
    }
    int sectionToOpen = findFirstOpenableSection(sessionInformations
            .getOrganizationInformations());
    eventBus.post(new NavigationChangedEvent(sectionToOpen));
    switch (sectionToOpen) {
      case R.id.dashboard:
        if(dc_id != -1){
          IntentStarter.showDashAfterRequest(this,dc_id);
        }else{
          IntentStarter.showDashboard(this);
        }
        break;
        ...
      default:
        IntentStarter.showNoSectionAvailable(this);
    }
  }

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    Bundle extras = intent.getExtras();
    if (extras != null) {
      String showAction = intent.getStringExtra(EXTRA_SHOW_ACTION);
        if (rightPane != null) {
          rightPane.setVisibility(View.GONE);
        }
        switch (extras.getInt(EXTRA_MENU_ITEM, -1)) {
          case EXTRA_MENU_ITEM_DASHBOARD:
            getSupportFragmentManager().beginTransaction()
                      .replace(R.id.container, DashboardFragmentBuilder
                              .newDashboardFragment(sessionInformations.getUser().getId(),
                                      getResources().getString(R.string.dashboard_personalDashboard),
                                      "pda"), "DASHBOARD")
                      .commit();
            }
            drawerLayout.closeDrawer(GravityCompat.START);
            break;
            ...
          case EXTRA_MENU_ITEM_LOGOUT:
            logout();
            break;
          default:
            break;
    }
  }
}

IntentStarter:

public final class IntentStarter {
  public static void showDashboard(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.putExtra(MainActivity.EXTRA_MENU_ITEM, MainActivity.EXTRA_MENU_ITEM_DASHBOARD);
    context.startActivity(intent);
  }
}

NavigationDrawerFragment:

public class NavigationDrawerFragment extends MeerkatFragment {

      @OnClick({R.id.dashboard, ... R.id.logout})
  public void onMenuItemSelected(View view) {
    switch (view.getId()) {
      case R.id.dashboard:
        desactivateAllViews();
        IntentStarter.showDashboard(getActivity());
        view.setActivated(true);
        break;
      case R.id.logout:
        IntentStarter.logout(getActivity());
        view.setActivated(true);
        break;
        ...
    }
  } 
}

person Kapouter    schedule 23.02.2017    source источник
comment
К сожалению, вам нужно добавить код.   -  person Ibrahim Disouki    schedule 23.02.2017
comment
вы попробовали мой ответ ниже?   -  person ak sacha    schedule 23.02.2017
comment
Почему вы звоните startActivity(), чтобы начать хостинг Activity от ребенка Fragment? Вы можете использовать обратные вызовы - это простая навигация внутри одного Activity с несколькими дочерними Fragments? Если это так, вам никогда не нужно звонить startActivity Также ваш комментарий: I can put code on request, this is a complex app, - нам нужен только СООТВЕТСТВУЮЩИЙ код.   -  person Mark Keen    schedule 23.02.2017
comment
Я добавил код. Вы можете найти код DashboardFragment здесь.   -  person Kapouter    schedule 23.02.2017
comment
@MarkKeen Об этом, я не разрабатывал это приложение. Но я не понимаю, почему это может вызвать мою проблему. В противном случае попробую сделать навигацию.   -  person Kapouter    schedule 23.02.2017