使用FragmentTransaction调用片段创建多次替换片段

时间:2014-09-19 10:01:44

标签: android android-fragments fragmentmanager

这是我的代码

public void changeFragment(Fragment contentFragment, Fragment lastFragment, int resourseID,int animationType, boolean addToStack) {
if (contentFragment != lastFragment) {

   mContentFragmentTransaction = getFragmentManager().beginTransaction();
   FragmentTransactionExtended fragmentTransactionExtended = new FragmentTransactionExtended(this, mContentFragmentTransaction,lastFragment,contentFragment, resourseID);
   fragmentTransactionExtended.addTransition(animationType);
   mContentFragmentTransaction.replace(resourseID, contentFragment);
   if (addToStack) {
       mContentFragmentTransaction.addToBackStack(null);
   }
   mContentFragmentTransaction.commit();
   }

}

问题是,每当我使用这种方法更改片段时,片段的oncreate将多次触发,第一次,它运行一次,第二次运行两次,第三次三次,希望有人知道这里发生了什么。

1 个答案:

答案 0 :(得分:0)

addToBackstack创建片段状态的快照。这意味着当您按下后退按钮时,您实际上将恢复到调用addToBackstack的最后一个状态。

您必须在具有片段的容器上调用replace,而不是片段本身。因此,不应该调用replace(R.id.dashboard, fragment),而应该是replace(R.id.dashboards_container, fragment)

您是否尝试过使用其他方法,例如remove(),然后执行add()。或类似的东西?有些人说,replace()方法并不总是表现正常。 如果活动的状态已经保存,则不再可以安全地调用提交。您必须改为呼叫commitAllowingStateLoss()。 即使您使用替换或删除呼叫,也无法执行此操作。我找到的唯一解决方法是创建片段的新实例并每次添加它。删除或替换片段后,最好删除所有对它的引用,以便GC可以处理它。

问候maven