Android addToBackStack()包含2个以上的碎片

时间:2013-06-10 20:40:54

标签: android android-fragments

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

我有1个主片段和许多次片段。 A->(B,C,D,E,F)其中片段A应始终堆叠在后台堆栈上,但片段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();

问题在于,如果我从片段A转到片段B并且回击按钮一切正常。我可以多次这样做。

然后,当我去A-> B时,然后将B切换几次,A->(B,C,D)并回击,我仍然很好,我回到A.但是,当我已经完成了上述操作,然后我再次尝试这样做。我再次从A - > B(没有重新启动活动)然后将B切换到C,D然后再回击,片段A不再存在,我得到一个空指针异常。

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

在尝试引用片段A之前,我总是使用getFragmentManager().executePendingTransactions();

谢谢!

1 个答案:

答案 0 :(得分:0)

在阅读thisthis帖后,我意识到replace()调用remove()应调用片段的onDestroy()方法,就我而言片段A与视图相关联,因此如果我调用replace(),则无法保证片段A仍然存在且不会重新创建。因此,我使用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();