底部导航视图中加载的片段在方向更改时变为空



在我的活动中,我有一个包含5个项目的底部导航视图。在底部导航视图中单击每个项目时,我都会加载一个片段。假设我在第三个项目上,并且我正在改变方向,那么活动被重新创建,并且它显示为所选的第一个项目。我通过在活动中提供以下代码来避免这种情况。

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.clear()
outState.putInt("tabSelected", bottomNav.selectedItemId)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
bottomNav.selectedItemId = savedInstanceState.getInt("tabSelected")
}

通过给出上面的代码,我成功地将第三项显示为选中。但这里的问题是,正在重新创建片段,并且我的savedInstanceState在该片段中始终为null。我已经给

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
}

在我的片段中。

在这种情况下,我如何保存片段的所有内容?

更新:虽然我给了retainInstance = true,但在我的supportFragmentManager中没有看到任何片段

请确保在清单文件中为您正在加载片段的活动写入以下行

android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
bottomNav.selectedItemId = savedInstanceState.getInt("tabSelected")

这一行重新选择底部导航中的项目,但它也会触发菜单操作。菜单监听器可能只是用一个新的实例替换现有的片段。

设备旋转后,现有片段应仍然存在,且savedINstanceState为非空

当您用新的片段替换该片段时,您是否尝试过将.addToBackStack(null)方法添加到事务管理器中。这应该会在调用commit到savedinstanceproperty之前保存片段的状态。如果你做.addToBackStack(String tag),你甚至可以调用特定片段的后台。

这是一些文档

我认为,如果你想在片段中保留配置,你也可以在这里和这里阅读setRetainInstance(true)。这种方法可以避免在设备方向上重新创建你的片段,但如果你这样做,你可能需要覆盖ActivityCreated上的方法,onAttach和onDetach,并告诉他们如何绘制片段,而不是像你现在可能正在做的那样在onCreateView中绘制。

最新更新