Поведение фрагментов: FragmentTransaction :: replace () и обратная операция backStack - PullRequest
5 голосов
/ 03 июня 2011

Я вызываю этот метод для перехода от AFrag к BFrag:

showFragment()
{ 
    FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();

    // Add fragment to the container ContentView 
    fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag());

    // Add FADE effect
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);   

    // Keep the transaction in the back stack so it will be reversed when backbutton is pressed
    fragmentTransaction.addToBackStack(null);

    // Commit transaction
    fragmentTransaction.commit();
}

Показывает новый фрагмент (BFrag), заменяет предыдущий (AFrag) и сохраняет информацию о транзакции, так что он может быть отменен / отменен автоматически при нажатии кнопки возврата.

При нажатии кнопки назад все выглядит хорошо, отображается предыдущий фрагмент (AFrag). Но когда я снова иду вперед (AFrag -> BFrag), я получаю «Исключение из уже добавленного фрагмента».

Разве операция удаления / отмены не удаляет новый фрагмент (BFrag)? Это ожидаемое поведение?

Это странно, потому что после этого я решил установить чек:

 if(mBFrag.isAdded()) 
 {
    fragmentTransaction.show(mBFrag);
 }
 else 
 {
   fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag());
 }

и все еще, это входит в оператор else ... и я получаю исключение.

Понимаете, что я делаю не так, пожалуйста?

Thx.

1 Ответ

4 голосов
/ 10 июня 2011

пытались ли вы использовать другой метод, например, remove (), затем выполните add ().или что-нибудь подобное?В другом посте я видел, что метод replace () не всегда ведет себя правильно.

...