2016-03-02 3 views
1

У меня есть одно мероприятие, ActivityA и 3 фрагмента, FragmentA, FragmentB и FragmentC.Фрагмент не отображается после поворота экрана

Чтобы добавить Fragmenta, я использую replace, где fragment является новым экземпляром FragmentA:

getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.frame_layout_fragment, fragment) 
     .commit(); 

В onCreate методы ActivityA, я чек на FragmentA создание:

if (savedInstanceState == null) { 
    FragmentA fragmentA = FragmentA.newInstance(); 

    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.frame_layout_fragment, fragmentA) 
      .commit(); 
} 

Чтобы добавить FragmentB и FragmentC, я использую add и addToBackStack, где fragment является либо новым экземпляром из FragmentB или FragmentC:

getSupportFragmentManager() 
     .beginTransaction() 
     .add(R.id.frame_layout_fragment, fragment) 
     .addToBackStack(null) 
     .commit(); 

я нажимаю кнопку назад в то время как на FragmentC, он показывает FragmentB, и нажав на кнопку назад, а на FragmentB показывает FragmentA, как и ожидалось. Пока я был на FragmentC, я вращаю устройство, и FragmentC все еще показывает, как и ожидалось.

Однако, когда я перейти от FragmentC к FragmentA при помощи 2 нажатия на кнопку назад, затем повернуть устройство в два раза, портрет -> пейзаж -> портрет, добавить FragmentB, добавить FragmentC, то я повернуть устройство один раз, я Ожидается FragmentC, чтобы показать, но вместо FragmentB показывает. Когда я нажимаю кнопку назад один раз, ничего не происходит. Когда я снова нажимаю его, он возвращается обратно к FragmentA. Кажется, что FragmentC присутствует в задней стеке, но по какой-то причине его не видно.

Почему FragmentC не отображается в этом сценарии?

ответ

1

Я думаю, что это ответ на другой вопрос, ваш ответ тоже: Difference between add(), replace(), and addToBackStack()

Он говорит:

разница

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

+0

Вращение устройства вызывает onCreateView для каждого фрагмента в моем случае. FragmentC не отображается, хотя вызывается onCreateView. – catsfw

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