android - kotlin android nav graph go back 导致重新创建旧片段
问题描述
当我像这样从片段 B 回到片段 A 时,我的项目中有很大的问题:
findNavController().navigateUp()
或者
activity?.onBackPressed()
导致旧片段被重新创建我不知道为什么
这是我的行动:
<action
android:id="@+id/action_fragmentA_to_fragmentB"
app:destination="@id/fragmentB" />
val action = ScanningFragmentDirections.action_fragmentA_to_fragmentB(
scanningViewModel.containerLevel,
container
)
NavHostFragment.findNavController(this).navigate(action)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding =
DataBindingUtil.inflate(inflater, R.layout.scanning_fragment, container, false)
binding!!.viewmodel = scanningViewModel
binding!!.lifecycleOwner = this
return binding!!.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init()
}
解决方案
当您从一个片段导航到另一个片段时,您的片段视图被破坏(onDestroyView
被调用)。当您导航回之前在视图中的片段时,将重新创建(onCreateView
被调用)。
在某些情况下,您不希望重新创建片段(前段时间我有一个带有 a 的片段,MapView
我不想再次添加所有不同的标记和多边形)。你可以尝试这样的事情:
在您的片段类中创建一个字段以保存您的视图:
private lateinit var contentView: View
onCreateView
如果您的变量尚未初始化,则仅在函数中膨胀视图。
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (!::contentView.isInitialized) {
contentView = inflater.inflate(R.layout.fragment_home, container, false)
}
return contentView
}
推荐阅读
- sql - 根据具有特定条件的 SQL Server 表中可用的数据创建组?
- python - Python求解器函数,如Excel工作表求解器函数,用于根据数据集预测a和b值
- bash - 在 gitlab CI 中运行 docker-compose 时执行 bash 脚本
- android - 如何在活动重新创建期间保留导体的路由器对象?
- java - 导航抽屉应用程序在单击时不会更改片段
- sql - 使用 Unpivot 时需要使用函数作为字段
- java - 转换地图
> 到地图 使用流 - python-docx - 在同一级别添加两个段落
- mysql - 如果某些值不存在,MySQL INSERT 多行
- android - 发送 MAKE_CREDENTIAL(0x01) 响应时出现超时问题