如何在支持屏幕旋转的同时添加我的初始片段?

时间:2015-07-20 23:32:20

标签: android android-fragments fragment-backstack fragmentmanager

当我的应用程序启动时,我会在未添加到后台堆栈的事务中向内容布局添加一个片段实例(例如,fragment1)。此片段显示一些已通过newInstance(List<Obj>)静态方法传递给它的缓存数据。在onSaveInstanceState()我保存数据,以便在重新创建片段时显示它。

现在假设我没有重新创建片段。假设我用第二个片段替换它,比如说fragment2(这次将事务添加到后栈),执行两次屏幕旋转,然后按回来。该应用将弹出后筹码并尝试再次显示fragment1,然后该List<Obj>会尝试显示null NullPointerException,这样就会抛出fragment1。< / p>

我理解这是因为onBackPressed()实例从未在第一时间保存,因为它不在后堆栈中,并且在设备旋转时也没有显示。

我的问题是,在这种情况下支持屏幕旋转的最合适的方法是什么?我可以在后台堆栈中保存初始事务,并在弹出后台堆栈之前让getSupportFragmentManager().getBackStackEntryCount() >= 1验证fragment1(我不希望弹出初始事务,因为{{1}}是我的初始值屏幕)但我不认为这是正确的方法。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您的列表不是很大,那么要做的就是将其传递到onSaveInstanceState中的捆绑包并在onRestoreInstanceState中检索它。即使片段不在前台,仍应在销毁/重新创建时调用这些方法。但是,如果数据非常大或不可序列化或可分割,则不能选择。

来自docs:

  

如果重新启动活动需要恢复大量数据,重新建立网络连接或执行其他密集操作,则由于配置更改而导致的完全重启可能会降低用户体验。 [...]在这种情况下,您可以通过在配置更改时重新启动活动时保留片段来减轻重新初始化活动的负担。此片段可以包含对要保留的有状态对象的引用。

听起来好像在这种情况下你想要保留包含List<Obj>的片段。问题是,这需要您的活动检查它可以在onCreate中创建的所有保留片段,看看它们是否已经存在,并且您已经表达了对此实例中可维护性的担忧。

在最后一种情况下,您可以通过在Android清单中使用android:configChanges参数声明自己打算自行处理方向更改。这将阻止您的活动(及其关联的片段及其成员)在方向更改中被销毁和重新创建,而系统将在您的活动中调用onConfigurationChanged。如果您不覆盖onConfigurationChanged,除了屏幕将旋转之外,方向更改不会发生任何变化。除其他原因外,谷歌不鼓励这样做,因为它有代码味道。求助于此意味着您没有很好地处理状态更改,并且如果您的活动在用户查看其他内容时被销毁,则您的状态将无法正确保留。

编辑:

如果您的片段通过其参数包接收其数据,例如从对setArguments()的调用,该捆绑包&#34; will be retained across fragment destroy and creation.&#34;