Поведение фрагментов: FragmentTransaction::replace() и обратная операция backStack

Я вызываю этот метод для перехода от 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... и я получаю исключение.

Любое понимание того, что я делаю неправильно, пожалуйста?

Спасибо.


person Axel M. Garcia    schedule 03.06.2011    source источник


Ответы (1)


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

person Christ    schedule 10.06.2011
comment
Да, ответ и другой пост, о котором вы говорите, мой приятель xD stackoverflow.com/questions/6250580/ В любом случае спасибо - person Axel M. Garcia; 10.06.2011
comment
Я рад это слышать, мне просто интересно, что ошибка была с моим кодом, как всегда. Спасибо за уточнение. - person Eduardo Reis; 02.08.2017