在我的活动中,我有一个包含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中绘制。