Android FragmentManager在清除片段时调用onCreateView

时间:2014-09-14 14:10:52

标签: android android-fragments

我有这些片段操作的方法:

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);
    }
}

情景:

在创建活动时,我从片段A开始。 addFragment(new A,false);

然后我添加片段B. replaceFragment(新B);

我添加了另一个片段C. addFragment(新C);

在C片段中我想将应用程序重置为A片段。我叫 clearFragments(); addFragment(new A,false);

问题是在按下C片段上的按钮后调用B片段onCreateView,该片段清除片段并添加A片段。我没有看到片段,但它启动了崩溃我的应用程序的后台线程。我需要清除所有片段而不调用他们的onCreateView()方法。

这是预期的行为,还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

实际上,在这种情况下,您将始终返回到片段B。

一步一步:

  1. 添加A.
  2. 用B替换A< - 在此步骤之后,您的活动中没有A。
  3. 添加C.这里您要添加另一个片段并告诉FragmentManager将片段的当前状态保留到后栈。此时您当前的状态是片段B.然后添加片段C.
  4. 当您调用clearFragments时,FragmentManager将返回到第一个保存状态 - 此状态为片段B。
  5. 也许你忘了提一下?我试图在后面的堆栈中放入几个条目然后重置为第一个状态 - onCreateView被调用一次,仅用于第一个片段。