gpt4 book ai didi

Android FragmentManager 在清除 fragment 时调用 onCreateView

转载 作者:行者123 更新时间:2023-11-30 02:40:28 25 4
gpt4 key购买 nike

我有这些 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。

一步一步:

  1. 添加 A.
  2. 用 B 替换 A <- 在这一步之后,您的 Activity 中就没有 A 了。
  3. 添加 C。在这里您要添加另一个 fragment 并告诉 FragmentManager 将 fragment 的当前状态保存到后台堆栈。此时您的当前状态是 fragment B。然后添加 fragment C。
  4. 当您调用 clearFragments 时,FragmentManager 返回到第一个保存的状态 - 这个状态是 fragment B。

也许你忘了说点什么?我尝试将多个条目放入后退堆栈,然后重置为第一个状态 - onCreateView 被调用一次,仅针对第一个 fragment 。

关于Android FragmentManager 在清除 fragment 时调用 onCreateView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com