Android 通过删除前一个片段替换当前片段

Android 通过删除前一个片段替换当前片段,android,android-fragments,Android,Android Fragments,我需要能够通过这样的片段:A->B->C1 当我在C1上时,我需要将其替换为C2,但当我按下back时,我应该返回到B,而不是C1。 我可以这样做: String tag = fragment.getClass().getName(); FragmentManager manager = getSupportFragmentManager(); manager.popBackStack(); FragmentTransaction ft = manager.beg

我需要能够通过这样的片段:A->B->C1 当我在C1上时,我需要将其替换为C2,但当我按下back时,我应该返回到B,而不是C1。 我可以这样做:

    String tag = fragment.getClass().getName();
    FragmentManager manager = getSupportFragmentManager();
    manager.popBackStack();
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.mainActivity_container, fragment, tag);
    ft.addToBackStack(tag);
    ft.commit();
问题是,当我从C1更改为C2时,fragmentB会调用它的onCreateInnerView方法

我需要能够做这样的事情:A->B->C1->C2->C1->C2,通过按C2返回到B


如何在不重新创建片段的情况下执行替换B

在移动到片段时,首先不需要
popupstack
。因为它将调用上一个堆栈的片段
onViewCreated
方法

移动到B->C1B->C2C1->C2时:

  • 需要添加回栈
    null
  • 移除PopuBackStack

我希望它对你有用。

试试看,这可能会对你有所帮助, 只需更换两条线路

  manager.popBackStack();//Remove this line
  ft.replace(R.id.mainActivity_container, fragment);//Remove 3rd param in this line
  ft.addToBackStack(tag);//Remove this line
已编辑
你也可以试试这个

 public void switchContent(Fragment fragment) {

    FragmentManager fragmentManager = getSupportFragmentManager();

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  

     for (int i = 0; i < fragmentManager.getBackStackEntryCount(); ++i) {
     Fragment currentFragment = this.getSupportFragmentManager().findFragmentById(R.id.mainActivity_container);
        if(currentFragment != B){
        fragmentManager.popBackStack();
        }
    }
    fragmentTransaction.replace(R.id.mainActivity_container, fragment).commit();
}
公共内容(片段){
FragmentManager FragmentManager=getSupportFragmentManager();
FragmentTransaction FragmentTransaction=fragmentManager.beginTransaction();
对于(int i=0;i
您可以处理onBackPressed()事件,并将当前片段替换为片段B。

因此,您希望出现如下流:A->B->C1->C2(现在按back键)->B等等。。对吧?对。它也可以像A->B->C2->C1一样,当我按下C1键时,在这种情况下,我仍然需要返回到B。好的,明白了。因此,在移动到B->C1和B->C2时,不要添加“manager.popBackStack();”还有addToBackStack(null)。@Kling Klang,如果我只是从back key上的堆栈中删除C1和C2片段,这看起来确实是一个可能的黑客攻击。即使这种方法是不直观的,并且每种情况都需要额外的代码。@KlingKlang,因为我找不到其他更好的方法,你能把你的评论作为答案,这样我就可以把它标记为正确的吗?按B->C1->C2,然后按back,我返回C1,而不是按BWon,这不就是删除所有片段吗?我将松开A和B:(@SMGhost我认为这是最终的解决方案。抱歉。您的回答忽略了在C1和C2之间切换时不重新膨胀片段B的要点。另一个问题是,如果B是硬编码的,或者我必须在其他地方跟踪它,那么这不再是通用方法。我最终使用了这种方法。我已经编写了方法popToFragment(类clazz);我只是不断弹出片段,直到后堆栈中的最后一个片段是我指定的类。我仍然希望有一种更直观的替换方法。