我有一个非常奇怪的错误,我无法弄清楚。
我有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();
。
谢谢!
答案 0 :(得分:0)
在阅读this和this帖后,我意识到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();