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