Fragment事务提交触发父Activity onCreate重复执行问题求助
解决Fragment切换后父Activity onCreate重新执行导致Fragment被覆盖的问题
这个问题的核心原因几乎可以确定是你的RegisterActivity在Fragment切换时意外触发了重建,导致onCreate方法再次执行,重新添加了FatherFragment,把刚切换的MapsFragment给覆盖了。下面给你几个针对性的解决方案:
方案1:阻止因配置变更导致的Activity重启
最常见的触发Activity重建的场景是配置变更(比如屏幕旋转、屏幕尺寸变化、输入法状态切换等)。你可以在AndroidManifest.xml中给RegisterActivity添加configChanges属性,告诉系统这些配置变化时不要重启Activity:
<activity android:name=".RegisterActivity" android:configChanges="orientation|screenSize|keyboardHidden|screenLayout"> <!-- 其他原有属性保持不变 --> </activity>
这样当这些配置发生变化时,系统会调用Activity的onConfigurationChanged方法而不是重启它,也就不会再次执行onCreate了。
方案2:在Activity onCreate中判断是否为首次创建
如果你的业务需要允许Activity在某些场景下重建(比如系统内存不足回收后重启),那可以通过savedInstanceState参数判断是否是首次创建Activity,只有首次创建时才添加初始的FatherFragment:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); // 只有当savedInstanceState为null时,才是首次创建Activity,添加初始Fragment if (savedInstanceState == null) { FatherFragment fatherFragment = new FatherFragment(); getSupportFragmentManager().beginTransaction() .add(R.id.fragmentContainer, fatherFragment, "RegisterParentFragment") .commit(); } }
当Activity重建时,savedInstanceState不为null,这时候系统会自动恢复之前的Fragment状态,你就不需要再手动添加FatherFragment了。
额外优化:给Fragment事务添加回退栈(可选)
如果你希望用户按返回键能回到之前的FatherFragment,可以在切换Fragment的事务中添加addToBackStack,提升用户体验:
getActivity().getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentContainer, mapsFragment, "mapaFragment") .addToBackStack(null) // 将当前事务添加到回退栈 .commit();
内容的提问来源于stack exchange,提问作者Christian Cespedes Medina
相关产品推荐
相关产品推荐

