由于支持版本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:
,onCreateView和ActivityCreated被调用了2次。不好。
在25.1.1中,它更糟糕。在替换为fragmentA之后,对于backstack中的所有视图,都会调用onCreateView和ActivityCreated。现在,这很有趣:)试试我的示例应用并查看logcat。更改app.gradle文件中的支持版本以查看差异。
如果有人能够认识到这个问题,我会很高兴,所以我们可以找到克服甚至解决这个问题的方法。
答案 0 :(得分:4)
好吧,我遇到了同样的问题,并通过比较25.0.1找到了解决方案 - > 25.1.1 FragmentManager.class 。尝试使用FragmentTransaction的 setAllowOptimization 方法。