自从支持版本 25.1.0 和最新的 25.1.1 以来,我在片段替换/添加方面遇到了奇怪的行为。
25.1.0 已报告问题Android -fragmentTransaction.replace() 不适用于支持库 25.1.0 https://stackoverflow.com/questions/41158071/android-fragmenttransaction-replace-not-works-on-support-library-25-1-0
但现在在 25.1.1 中我遇到了类似的问题。为了重现我创建的示例应用程序的行为,您可以在以下位置找到它https://github.com/holoduke/fragmenttest 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替换当前fragment
添加片段 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() 就会增加。那挺好的。
现在是奇怪的部分。
我们想添加带有 popbackStackImmediate 的 FragmentS (以清除历史记录)
这里 3 个支持版本的行为都变得疯狂。
假设您在所有 3 个版本中执行以下 bavhiour:
- 启动应用程序
- 替换为片段B
- 替换为片段C
- 替换为片段B
- 替换为片段C
- 替换为片段A
在 25.0.1 中一切正常。清除backstack并在FragmentA中调用onCreateView和ActivityCreated。
在 25.1.0 中,在替换为 FragmentA 之后,onCreateView 和 ActivityCreated 被调用了 2 次。不好。
在 25.1.1 中情况更糟。替换为fragmentA后,对于backstack中的所有视图,都会调用onCreateView和ActivityCreated。现在这很有趣,对吧:)
只需尝试我的示例应用程序并查看 logcat。更改 app.gradle 文件中的支持版本以查看差异。
如果有人也能够认识到这个问题,我会很高兴,这样我们就可以找到一种方法来克服甚至解决这个问题。