0

我有一个非常奇怪的错误,我无法弄清楚。

我有 1 个主要片段和许多次要片段。A->(B,C,D,E,F) 其中 Fragment A 应始终堆叠在 backstack 上,但 Fragment B,C,D,E 应进出变化。

我使用这些代码行来做到这一点:

    getFragmentManager().executePendingTransactions();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    MyFragment mListFragment = new MyFragment();
    transaction.replace(R.id.listFragmentPlaceHold, mListFragment, FRAGMENT_TAG);
    if(getFragmentManager().getBackStackEntryCount() == 0)
            transaction.addToBackStack(null);
    transaction.commit();

问题是这样的,如果我从 Fragment A 转到 Fragment B 并且回击按钮一切正常。我可以随意多次这样做。

然后,当我去 A->B 然后切换 B 几次,A->(B,C,D) 并回击,我仍然很好,我回到 A。但是,当我完成上述,然后我尝试再做一次。我再次从 A -> B (不重新启动活动)然后将 B 切换到 C、D 然后回击,片段 A 不再存在并且我得到空指针异常。

有人可以帮帮我吗,这让我发疯了。

我总是getFragmentManager().executePendingTransactions();在尝试引用 Fragment A 之前使用。

谢谢!

4

1 回答 1

0

所以在阅读了这篇文章和这篇文章之后,我意识到应该调用片段的replace()方法的调用,在我的例子中,片段 A 与视图相关联,因此如果我调用,不能保证片段 A 仍然存在并且不会被重新创建。因此,我改用它来解决问题。remove()onDestroy()replace()detach()

我的理解可能是错误的......但这确实解决了问题:

getFragmentManager().executePendingTransactions();
MyFragment1 mListFragment1 = 
           (MyFragment1) getFragmentManager().findFragmentByTag(MY_FRAG1);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
MyFragment mListFragment = new MyFragment();
transaction.replace(R.id.listFragmentPlaceHold, mListFragment, FRAGMENT_TAG);
if(getFragmentManager().getBackStackEntryCount() == 0){
      transaction.detach(mListFragment1);
      transaction.add(R.id.listFragmentPlaceHold, mListFragment, FRAGMENT_TAG);
      transaction.addToBackStack(null);
}else{
      transaction.replace(R.id.listFragmentPlaceHold, mListFragment, FRAGMENT_TAG);
}
transaction.commit();
于 2013-06-11T17:05:45.610 回答