FragmentTransaction:replace和addToBackStack不能一起工作?

我对Android开发相当陌生,现在运行起来怪异的行为。

  • 我有一个空的FrameLayout是一个片段的容器。
  • 如果用户第一次按下button,生成新的碎片并放入容器中。
  • 如果用户稍后按下一个button,并且容器内存在片段,则用新生成的片段replace现有片段。
  • 如果用户按回button,popup容器内的片段。

这是我的代码

public void showFragment(View v) { FragmentA f = new FragmentA(); FragmentManager fm = getSupportFragmentManager(); String tag = f.getFragmentTag(); // instance method of a to get a tag FragmentTransaction ft = fm.beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_top, 0, 0, R.anim.slide_out_top); ft.replace(R.id.container, f, tag); ft.addToBackStack(tag); ft.commit(); } @Override public void onBackPressed() { FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() > 0) { fm.popBackStack(); } else { super.onBackPressed(); } } 

当用户第一次按下button时,它就像我所期望的那样,为容器添加新的片段。 但是,第二次用户按下button时,容器仍然包含一个片段,而不是replace,它会在现有的顶部添加一个新的。 所以,在容器内部2个碎片,2个背部按压去除所有碎片。

我发现如果我删除线

 ft.addToBackStack(); 

并重新像下面的onBackPress()方法,它再次像我期望的一样(容器中的一个片段一次)

基本上,手动删除片段,而不是popFromBackStack方法

 private FragmentA currentFragment = null; // to hold the reference to exising fragment, if any. @Override public void onBackPressed() { if (currentFragment != null) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.setCustomAnimations(0, R.anim.slide_out_top); ft.remove(currentFragment); ft.commit(); currentFragment = null; } else { super.onBackPressed(); } } 

所以,我的问题是

  • replace和addToBackStack是不是在一起工作?
  • 或者,我做错了什么?

感谢所有意见和build议。

Related of "FragmentTransaction:replace和addToBackStack不能一起工作?"

addToBackstack创build你的片段状态的快照。 这意味着当你按下后退button时,你实际上是回到addToBackstack被调用的最后一个状态。

在你的情况下,你添加一个片段。 后退button将删除此添加的片段。 当你调用replace时,再次添加到backstack,你现在在后台有两个状态(1.当你添加了第一个片段时,2.当你没有添加片段时)。 如果你后退button删除当前片段,不要使用addToBackstack。 当你想在视图中保留片段的状态时,只使用addToBackstack。

对于那些仍在寻找解决scheme的人来说。

在主要的Activity类(托pipe片段)中,只需重写onBackPressed()

 @Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() > 0 ){ getFragmentManager().popBackStack(); } else { super.onBackPressed(); } } 

片段中没有onBackPressed()方法,这个方法只是用于activity 。 所以,当我们按下后退键时,会显示activity的默认行为,即

你将会去以前的活动(如果有的话)或者应用程序将退出。

现在我们需要重写这个方法来告诉activity ,当我们按下后退键时,如果有返回堆栈中的任何碎片,将它们popup(这是addToBackStack()进入图片时)。 否则,请按照默认行为。

在这里find更多的细节