2016-04-23 3 views
0

Я изучаю, как правильно использовать фрагменты. У меня есть 4 фрагмента:FragmentManager.popBackStack() добавляет фрагмент ниже текущего

  • B
  • Загрузка
  • Полная

Он должен сменяют друг друга в этой последовательности:

==>Загрузка ==>B ==>Загрузка ==>Полная

Метод, который изменит мою Fragment А в Загрузка:

LoadingFragment loadingFragment = new LoadingFragment(); 

    Bundle bundle = new Bundle(); 
    bundle.putBoolean("fragmentA", true); 

    loadingFragment.setArguments(bundle); 

    getFragmentManager().beginTransaction() 
      .replace(R.id.fragment_container, loadingFragment) 
      .addToBackStack(null) 
      .commit(); 

Изменение Фрагмент B в Загрузка выглядит аналогично (только аргументы изменяются, очевидно)

Метод, которые изменяются Загрузка фрагмента в фрагмент B:

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      getFragmentManager().beginTransaction() 
        .replace(R.id.fragment_container, new FragmentB()) 
        .commit(); 

     } 
    }).start(); 

Thread.sleep (...) - это просто длинная операция ... На этот раз я не добавляю .addToBackStack(null).

Хорошо. Теперь проблема:

Когда я использую метод getFragmentManager().popBackStack(), предыдущий фрагмент (А) добавляют ниже (мой фрагмент контейнер LinearLayout) мой фактический фрагмент вместо replaceing его. В соответствии с этим: https://stackoverflow.com/a/17793959/3279023 он должен работать, но это не так.

ответ

2

Поведение, которое вы испытываете, выглядит хорошо для меня. popBackStack() отменяет последние сэкономил Операция, которая в вашем случае: replace A with Loading.

Таким образом, он заменяет Loading на A, но это не влияет на B, очевидно, что вы добавили без записи транзакции.

В обоих случаях решение может использовать addToBackStack(), чтобы зафиксировать обе транзакции, а затем дважды позвонить popBackStack().

0

Несколько фрагментов могут сделать одно действие/экран. Задняя панель выглядит как обратная стрелка или возвращается к последней активности/экрану.

+0

Я знаю это ... но 'addToBackStack()' метод должен помнить всю транзакцию и выполнять и инвертировать это – Lau

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