我有这些 fragment 操作方法:
public void replaceFragment(Fragment fragment) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment);
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
}
public void addFragment(Fragment fragment, boolean addToBackStack) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment);
if (addToBackStack) {
fragmentTransaction.addToBackStack(fragment.getClass().getName());
}
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
}
public void clearFragments() {
if (fragmentManager.getBackStackEntryCount() > 0) {
FragmentManager.BackStackEntry first = fragmentManager.getBackStackEntryAt(0);
fragmentManager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
场景:
当创建 Activity 时,我从 fragment A 开始。 addFragment(new A, false);
然后我添加 fragment B。replaceFragment(new B);
我添加另一个 fragment C。addFragment(new C);
在 C fragment 中,我想将应用程序重置为 A fragment 。我调用 clearFragments();添加 fragment (新 A,假);
问题是 B fragment onCreateView
在 C fragment 上按下清除 fragment 并添加 A fragment 的按钮后被调用。我没有看到该 fragment ,但它启动了导致我的应用程序崩溃的后台线程。我需要在不调用它们的 onCreateView()
方法的情况下清除所有 fragment 。
这是预期的行为,还是我做错了什么?
最佳答案
实际上在这种情况下你总是会返回到 fragment B。
一步一步:
- 添加 A.
- 用 B 替换 A <- 在这一步之后,您的 Activity 中就没有 A 了。
- 添加 C。在这里您要添加另一个 fragment 并告诉 FragmentManager 将 fragment 的当前状态保存到后台堆栈。此时您的当前状态是 fragment B。然后添加 fragment C。
- 当您调用 clearFragments 时,FragmentManager 返回到第一个保存的状态 - 这个状态是 fragment B。
也许你忘了说点什么?我尝试将多个条目放入后退堆栈,然后重置为第一个状态 - onCreateView 被调用一次,仅针对第一个 fragment 。
关于Android FragmentManager 在清除 fragment 时调用 onCreateView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834142/