这是我的代码
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将多次触发,第一次,它运行一次,第二次运行两次,第三次三次,希望有人知道这里发生了什么。
答案 0 :(得分:0)
addToBackstack
创建片段状态的快照。这意味着当您按下后退按钮时,您实际上将恢复到调用addToBackstack
的最后一个状态。
您必须在具有片段的容器上调用replace,而不是片段本身。因此,不应该调用replace(R.id.dashboard, fragment)
,而应该是replace(R.id.dashboards_container, fragment)
。
您是否尝试过使用其他方法,例如remove(),然后执行add()。或类似的东西?有些人说,replace()方法并不总是表现正常。
如果活动的状态已经保存,则不再可以安全地调用提交。您必须改为呼叫commitAllowingStateLoss()
。
即使您使用替换或删除呼叫,也无法执行此操作。我找到的唯一解决方法是创建片段的新实例并每次添加它。删除或替换片段后,最好删除所有对它的引用,以便GC可以处理它。
问候maven