片段popbackstack行为在25.1.0和25.1.1中被破坏

时间:2017-02-02 13:35:47

标签: android fragment android-support-library fragmentmanager multiple-versions

由于支持版本25.1.0和最近的25.1.1,我在片段替换/添加时遇到了奇怪的行为。 报告了25.1.0 Android - fragmentTransaction.replace() not works on support library 25.1.0

的问题

但是现在在25.1.1中我遇到了类似的问题。要重现我创建的示例应用程序的行为,您可以在https://github.com/holoduke/fragmenttest

找到该应用程序

它基本上是一个带有片段容器的Activity。可以使用几个片段,按下按钮可以相互动态替换。我们首先从mainActivity本身添加FragmentA。

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    Fragment f = new FragmentA();
    fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    f.setRetainInstance(false);
    ft.replace(R.id.fragmenttarget, f);
    ft.addToBackStack(null);
    ft.commit();

所有好作品都很好。在25.0.1,25.1.0和25.1.1

现在在fragmentA中有3个按钮,它们都将用fragmentA,fragmentB或fragmentC替换当前片段

添加片段B和C的代码与片段A几乎相同,只是我们没有定义:

fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

当添加片段B或C时,执行以下代码:

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    Fragment f = new FragmentB();
    f.setRetainInstance(false);
    ft.replace(R.id.fragmenttarget, f);
    ft.addToBackStack(null);
    ft.commit();

25.0.1,25.1.0和25.1.1都很好。 如果你多次添加fragmentB和C,那么fm.getBackStackEntryCount()会增加。多数民众赞成。

现在奇怪的部分。 我们想用popStackImmediate添加FragmentA(以清除历史记录) 这三种支持版本的行为都很疯狂。

假设您在所有3个版本中执行以下bavhiour:

  1. 启动应用
  2. 替换为片段B
  3. 替换为片段C
  4. 替换为片段B
  5. 替换为片段C
  6. 替换为片段A
  7. 25.0.1中的一切都很好。清除了backstack,并在FragmentA中调用onCreateView和ActivityCreated。

    在用FragmentA替换之后25.1.0中的

    ,onCreateView和ActivityCreated被调用了2次。不好。

    在25.1.1中,它更糟糕。在替换为fragmentA之后,对于backstack中的所有视图,都会调用onCreateView和ActivityCreated。现在,这很有趣:)

    试试我的示例应用并查看logcat。更改app.gradle文件中的支持版本以查看差异。

    如果有人能够认识到这个问题,我会很高兴,所以我们可以找到克服甚至解决这个问题的方法。

1 个答案:

答案 0 :(得分:4)

好吧,我遇到了同样的问题,并通过比较25.0.1找到了解决方案 - > 25.1.1 FragmentManager.class 。尝试使用FragmentTransaction的 setAllowOptimization 方法。