其他分享
首页 > 其他分享> > android-在25.1.0和25.1.1中打破的片段popbackstack行为

android-在25.1.0和25.1.1中打破的片段popbackstack行为

作者:互联网

从支持版本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找到它

它基本上是一个带有片段容器的活动.可以使用几个片段,通过按一个按钮可以动态地相互替换.我们首先从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:

>启动应用
>替换为片段B
>替换为片段C
>替换为片段B
>替换为片段C
>替换为片段A

在25.0.1中,一切正常.清除后堆栈,并在FragmentA中调用onCreateView和ActivityCreated.

在25.1.0中,用FragmentA替换后,onCreateView和ActivityCreated被调用了两次.不好.

在25.1.1中甚至更糟.用fragmentA替换后,将为后堆栈中的所有视图调用onCreateView和ActivityCreated.现在多数民众赞成在有趣的权利:)

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

如果有人也能够认识到这个问题,我将感到非常高兴,因此我们可以找到一种方法来克服甚至解决这个问题.

解决方法:

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

标签:fragmentmanager,android-support-library,fragment,multiple-versions,android
来源: https://codeday.me/bug/20191026/1935317.html